{
 "firmware": "Polly",
 "slug": "polly",
 "author": "Charles Vestal",
 "repo": "https://github.com/charlesvestal/fm1-polly",
 "licence": "GPL-3.0-only",
 "closed_source": false,
 "mapped_release": "v0.4.3",
 "mapped_commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
 "release_date": "2026-10-15",
 "date_mapped": "2026-10-16",
 "turns_it_into": "An eight-part arranger with chord progressions, song sections, two melody tracks and General MIDI sounds.",
 "docs": [
  {
   "title": "Polly overview",
   "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/README.md",
   "words": 1151,
   "read_at": "2026-10-16",
   "word_count_method": "Whitespace-separated tokens in the Markdown source."
  },
  {
   "title": "Polly guide",
   "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/MANUAL.md",
   "words": 16636,
   "read_at": "2026-10-16",
   "word_count_method": "Whitespace-separated tokens in the Markdown source."
  },
  {
   "title": "Polly licensing",
   "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/LICENSING.md",
   "words": 506,
   "read_at": "2026-10-16",
   "word_count_method": "Whitespace-separated tokens in the Markdown source."
  }
 ],
 "install": {
  "official": "https://github.com/charlesvestal/fm1-polly/releases/tag/v0.4.3",
  "hub": "https://thefirmwarehub.com/",
  "installer": "https://charlesvestal.github.io/fm1-polly/"
 },
 "part_id_notes": "Panel labels use SEL for B_SEL, ARP for Progression, SEQ for Band/Notes, ENV for Style, LFO for Mixer, EDIT for Sound and GLO for Setup; key numbering follows the physical F3–G5 keyboard, independently of octave and transpose. Entries marked any refer to normal operation; recovery, calibration and USB restore approval use their own input loops. Lists and help retain the underlying page keyboard role; a question blocks HOME/SAVE shortcuts but leaves plain keys active.",
 "modes": [
  {
   "id": "home",
   "name": "Home",
   "how_to_get_there": "Tap HOME from another page.",
   "what_it_is": "Live chord recognition and style, tempo, transpose and progression controls.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "song",
   "name": "Song",
   "how_to_get_there": "Tap HOME on Home.",
   "what_it_is": "Arrange up to 32 sections and their progression, groove, repeats and mutes.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "song_settings",
   "name": "Song settings",
   "how_to_get_there": "On Song, turn SELECT.",
   "what_it_is": "Section transpose, song intro, ending and end behavior.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "progression",
   "name": "Progression",
   "how_to_get_there": "Tap ARP.",
   "what_it_is": "Edit chords by bar and beat.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "progression_settings",
   "name": "Progression settings",
   "how_to_get_there": "On Progression, turn SELECT.",
   "what_it_is": "Length, meter, slash bass and progression name.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "band",
   "name": "Band",
   "how_to_get_there": "Tap SEQ from another page.",
   "what_it_is": "Record an instrument or melody, set the recording grid, and mute it.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "groove_length",
   "name": "Groove length",
   "how_to_get_there": "On Band, turn SELECT.",
   "what_it_is": "Groove length, meter and name.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "sound",
   "name": "Sound",
   "how_to_get_there": "Tap EDIT outside Notes.",
   "what_it_is": "Choose an instrument sound and its chord behavior, or a melody sound, channel and recording velocity.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "sound_settings",
   "name": "Sound 2",
   "how_to_get_there": "With a band instrument selected, turn SELECT on Sound.",
   "what_it_is": "Instrument high key and MIDI channel.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "mixer",
   "name": "Mixer",
   "how_to_get_there": "Tap LFO.",
   "what_it_is": "Selected instrument or melody volume, pan and effect sends.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "mixer_tone",
   "name": "Mixer tone",
   "how_to_get_there": "On Mixer, turn SELECT.",
   "what_it_is": "Selected instrument or melody brightness and resonance.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "effects",
   "name": "Effects",
   "how_to_get_there": "Tap FX.",
   "what_it_is": "Shared reverb and chorus settings for every song.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "style",
   "name": "Style",
   "how_to_get_there": "Tap ENV.",
   "what_it_is": "Choose the patterns for Intro, Groove A and Groove B.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "style_more",
   "name": "Style page 2",
   "how_to_get_there": "On Style, turn SELECT.",
   "what_it_is": "Choose the patterns for both fills and Ending.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "setup",
   "name": "Setup",
   "how_to_get_there": "Tap GLO.",
   "what_it_is": "Clock, outgoing MIDI, lights and metronome settings.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "status",
   "name": "Status",
   "how_to_get_there": "On Setup, turn SELECT.",
   "what_it_is": "Processor, voices, audio dropouts and version information.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "notes",
   "name": "Notes",
   "how_to_get_there": "Tap SEQ while Band or Groove length is open.",
   "what_it_is": "Select, move, enter and delete notes in one instrument or melody.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "41-68",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L41-L68"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "1977-2000",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
    }
   ]
  },
  {
   "id": "list",
   "name": "Page list",
   "how_to_get_there": "Tap SEL.",
   "what_it_is": "Page settings and contextual actions.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "3963-3980",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3963-L3980"
    }
   ]
  },
  {
   "id": "memory",
   "name": "Memory",
   "how_to_get_there": "Choose MEMORY in the Band or Sound list, or tap SEL just after a no-space message.",
   "what_it_is": "The 16 shared places and actions to free their contents.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "3245-3264",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3245-L3264"
    }
   ]
  },
  {
   "id": "confirmation",
   "name": "Question",
   "how_to_get_there": "Start an action that asks before proceeding.",
   "what_it_is": "SEL accepts; HOME declines, with each question spelling out its scope.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "2470-2504",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2470-L2504"
    }
   ]
  },
  {
   "id": "help",
   "name": "Button help",
   "how_to_get_there": "Hold a button other than HOME alone for one second.",
   "what_it_is": "A contextual help card consumes an unused release action; PLAY has already acted on press.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "2055-2067",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2055-L2067"
    }
   ]
  },
  {
   "id": "home_held",
   "name": "HOME shortcuts",
   "how_to_get_there": "Hold HOME for 400 milliseconds.",
   "what_it_is": "Progression and groove shortcuts, tempo, song, undo and redo.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/pages.c",
     "lines": "578-582",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L578-L582"
    }
   ]
  },
  {
   "id": "update",
   "name": "Firmware update",
   "how_to_get_there": "Hold OCT- and OCT+ together for five seconds.",
   "what_it_is": "A countdown leads into the device bootloader for firmware installation.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "330-347",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L330-L347"
    }
   ]
  },
  {
   "id": "safe_mode",
   "name": "Safe mode",
   "how_to_get_there": "Starts automatically after two failed starts.",
   "what_it_is": "Audio and the arranger stay off while USB permits reinstallation; PLAY retries starting Polly. Four consecutive failed starts instead enter the chip’s own update mode.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "184-225",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L184-L225"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "425-438",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L425-L438"
    }
   ]
  },
  {
   "id": "calibration",
   "name": "Panel calibration",
   "how_to_get_there": "Hold both OCT buttons while switching on.",
   "what_it_is": "A service screen learns which physical button and encoder belongs to each printed name.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "307-309",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L307-L309"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/panel.c",
     "lines": "46-108",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/panel.c#L46-L108"
    }
   ]
  },
  {
   "id": "restore_confirm",
   "name": "USB restore approval",
   "how_to_get_there": "Send a valid Polly backup from the computer while playback is stopped.",
   "what_it_is": "A separate restore screen waits for a physical SEL or HOME press, with a sixty-second cancellation timeout.",
   "source": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/main.c",
     "lines": "239-254",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/backup.c",
     "lines": "460-479",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/backup.c#L460-L479"
    }
   ]
  }
 ],
 "controls": {
  "button_fx": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens Effects on an unused tap, or closes its own open list without leaving the page.",
    "short_label": "EFFECTS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1977-2000",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1805-1820",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1805-L1820"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "51-57",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L51-L57"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "After one second held alone without keys or another use, shows this button’s help card and suppresses its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2055-2063",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2055-L2063"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens Style on an unused tap, or closes its own open list without leaving the page.",
    "short_label": "STYLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1977-2000",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1805-1820",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1805-L1820"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "51-57",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L51-L57"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "After one second held alone without keys or another use, shows this button’s help card and suppresses its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2055-2063",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2055-L2063"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens Mixer on an unused tap, or closes its own open list without leaving the page.",
    "short_label": "MIXER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1977-2000",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1805-1820",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1805-L1820"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "51-57",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L51-L57"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "After one second held alone without keys or another use, shows this button’s help card and suppresses its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2055-2063",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2055-L2063"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens Setup on an unused tap, or closes its own open list without leaving the page.",
    "short_label": "SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1977-2000",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1805-1820",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1805-L1820"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "51-57",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L51-L57"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "After one second held alone without keys or another use, shows this button’s help card and suppresses its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2055-2063",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2055-L2063"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens Progression on an unused tap, or closes its own open list without leaving the page.",
    "short_label": "PROGRESSION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1977-2000",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1805-1820",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1805-L1820"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "51-57",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L51-L57"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "After one second held alone without keys or another use, shows this button’s help card and suppresses its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2055-2063",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2055-L2063"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens Sound on an unused tap outside Notes, or closes its own open list.",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1977-2000",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "51-57",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L51-L57"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Deletes the selected note immediately without a question as an undoable edit, with flash saving on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "DELETE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1984-1987",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1984-L1987"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "233-242",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L233-L242"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "hold",
    "action": "While playback and recording run with the list closed, erases the selected part’s notes as the playhead passes without asking, with undo available and flash saving on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "ERASE PASS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "298-324",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L298-L324"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "After one second held alone without keys or another use, shows this button’s help card and suppresses its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2055-2063",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2055-L2063"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens Band on an unused tap from another page, or closes its own open list.",
    "short_label": "BAND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1977-2000",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1977-L2000"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "51-57",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L51-L57"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Opens Notes when no list is open.",
    "short_label": "NOTES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1989-1993",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1989-L1993"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Opens Notes when no list is open.",
    "short_label": "NOTES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1989-1993",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1989-L1993"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Returns to Band when no list is open.",
    "short_label": "BAND RETURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1989-1993",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1989-L1993"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "After one second held alone without keys or another use, shows this button’s help card and suppresses its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2055-2063",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2055-L2063"
     }
    ]
   }
  ],
  "button_home": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Returns to Home on an unused tap outside Home, closing a list first if one is open.",
    "short_label": "HOME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2017-2025",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2017-L2025"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Opens Song on an unused tap.",
    "short_label": "SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1805-1819",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1805-L1819"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "Closes the page list.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2017-2025",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2017-L2025"
     }
    ]
   },
   {
    "mode": "memory",
    "gesture": "release",
    "action": "Returns from Memory to the list that opened it, or to the page if entered from a no-space message.",
    "short_label": "MEMORY BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2017-2025",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2017-L2025"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3254-3264",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3254-L3264"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "While held, enables key shortcuts, tempo and song changes, undo and redo; after 400 milliseconds the shortcut view appears and release leaves the page unchanged.",
    "short_label": "SHORTCUTS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2055-2067",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2055-L2067"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "578-582",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L578-L582"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4149-4156",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4149-L4156"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "confirmation",
    "gesture": "press",
    "action": "Declines as soon as HOME is pressed, or chooses the alternative stated by a two-choice question.",
    "short_label": "NO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4148-4153",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4148-L4153"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2491-2504",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2491-L2504"
     }
    ]
   },
   {
    "mode": "confirmation",
    "gesture": "press",
    "action": "For the edited-grooves question, returns affected sections to the new style while retaining saved copies in Memory, saving pending edits first when stopped and requiring SAVE first during playback.",
    "short_label": "USE STYLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2288-2310",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2288-L2310"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2311-2330",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2311-L2330"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4148-4153",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4148-L4153"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "short_label": "CANCEL",
    "action": "Cancels the USB restore without changing the active saved data, though staging has already replaced the older inactive copies.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/backup.c",
      "lines": "20-28",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/backup.c#L20-L28"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/backup.c",
      "lines": "460-469",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/backup.c#L460-L469"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Immediately writes savable changed settings, songs, progressions, melodies and edited grooves without asking and retains available undo; shared grooves keep only the newest changed version and replace the others, while work that lacks storage is omitted.",
    "short_label": "SAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2027-2035",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2027-L2035"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "676-696",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L676-L696"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "697-717",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L697-L717"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "719-737",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L719-L737"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "742-750",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L742-L750"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "697-738",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L697-L738"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "419-445",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L419-L445"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "486-508",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L486-L508"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "544-578",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L544-L578"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "322-331",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L322-L331"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "hold",
    "action": "While held, white key n copies the playing or selected progression to Pn, asking if a different destination is nonempty, with undo and saving on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "COPY PROG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "hold",
    "action": "While held, white key n copies the playing or selected progression to Pn, asking if a different destination is nonempty, with undo and saving on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "COPY PROG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "hold",
    "action": "While held, white key n copies the playing or selected progression to Pn, asking if a different destination is nonempty, with undo and saving on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "COPY PROG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "hold",
    "action": "While held and stopped, white key n writes the current groove immediately to memory place n without undo, asking before replacing a different groove with notes and refusing places holding melodies or progressions.",
    "short_label": "COPY GROOVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3498",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3498"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3500-3512",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3500-L3512"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "hold",
    "action": "While held and stopped, white key n writes the current groove immediately to memory place n without undo, asking before replacing a different groove with notes and refusing places holding melodies or progressions.",
    "short_label": "COPY GROOVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3498",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3498"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3500-3512",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3500-L3512"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "After one second held alone without keys or another use, shows this button’s help card and suppresses its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2055-2063",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2055-L2063"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens the page list, or opens Memory just after a no-space message; during instrument recording it instead matches a shorter groove to its progression when offered.",
    "short_label": "PAGE LIST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2004-2015",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2004-L2015"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "Runs the selected action, advances the letter cursor on Letters, or opens the selected submenu.",
    "short_label": "DO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4077-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4077-L4089"
     }
    ]
   },
   {
    "mode": "confirmation",
    "gesture": "release",
    "action": "Accepts the question and runs its stated action.",
    "short_label": "YES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2004-2007",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2004-L2007"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2491-2504",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2491-L2504"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "hold",
    "action": "While held, SELECT or KNOB 1 moves the selected note and KNOB 3 changes its length in fine steps.",
    "short_label": "NOTE MODIFY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "140-147",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L140-L147"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "189-230",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L189-L230"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "After one second held alone without keys or another use, shows this button’s help card and suppresses its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2055-2063",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2055-L2063"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When CLEAR CHORD is selected, immediately removes the chord change at the cursor without asking as an undoable edit saved on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "CLEAR CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1078-1093",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1078-L1093"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When LOAD PROGRESSION is selected, loads the chosen factory progression and its name immediately into an empty place, otherwise asks first, as an undoable change saved on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "LOAD PROG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2514-2537",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2514-L2537"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When CLEAR PROGRESSION is selected for a nonempty progression, asks before clearing its chords as an undoable change saved on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "CLEAR PROG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2539-2557",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2539-L2557"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When STYLE TEMPO is selected, immediately restores the style’s tempo and lets future style choices change it again, with no question and saving on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "STYLE TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2273-2286",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2273-L2286"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When PLAY FROM SECTION is selected, starts from the cursor’s section immediately if stopped or at the next bar if playing, with a count-in if recording is armed.",
    "short_label": "PLAY FROM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1854-1873",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1854-L1873"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When INSERT SECTION is selected while stopped, immediately inserts a copy above the cursor without its melody notes, with undo and saving on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "INSERT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2686-2726",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2686-L2726"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When DELETE SECTION is selected while stopped, removes the cursor’s section immediately unless it has melody notes, in which case it asks first, with undo and saving on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "DELETE ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2686-2726",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2686-L2726"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When CLEAR SECTIONS is selected, asks if sections exist before clearing sections and their melody notes, retaining progressions, grooves, style, tempo, transpose and mutes, resetting Intro and Ending on and At end to stop, with undo and saving on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "CLEAR ROWS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2728-2759",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2728-L2759"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/loops.c",
      "lines": "240-252",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/loops.c#L240-L252"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When NEW SONG is selected while stopped, asks before saving pending work and replacing this song with defaults, retaining saved edited grooves in Memory and allowing undo, with the new state saved on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "NEW SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2761-2809",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2761-L2809"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When COPY SONG is selected while stopped, copies settings, sections, progressions and grooves to the chosen song and writes immediately, excluding source melody notes and deleting destination melody notes, asking only if destination sections exist and offering no destination undo.",
    "short_label": "COPY SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2823-2847",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2823-L2847"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2849-2864",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2849-L2864"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2868-2885",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2868-L2885"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When CLEAR plus an instrument name is selected, asks before requesting removal of that instrument’s groove notes, keeping its sound, with undo and saving on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "CLEAR TRACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2922-2948",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2922-L2948"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2922-2936",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2922-L2936"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "1011-1023",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L1011-L1023"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When CLEAR plus a groove name is selected, asks before immediately removing every note of that groove while keeping sounds, with undo and saving on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "CLEAR GROOVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2950-2985",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2950-L2985"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When BACK TO STYLE is selected, immediately restores this section’s style pattern, saving edited work first while stopped or requiring SAVE first during playback, with undo and the edited groove retained in Memory.",
    "short_label": "STYLE RETURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2987-3001",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2987-L3001"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When CLEAR M1 or CLEAR M2 is selected, asks before clearing that melody’s notes in the named section or whole song, keeping its sound, with undo and saving on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "CLEAR MELODY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2887-2920",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2887-L2920"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When QUANTISE M1 or M2 IN SECTION is selected, immediately moves that section’s melody notes onto the chosen grid without asking, as one undoable edit saved on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "QUANTISE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3004-3042",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3004-L3042"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When COPY M1 or M2 TO SECTION is selected, immediately replaces that section’s notes from the chosen source section, asking only if the destination has notes, keeping copied roots, excluding notes beyond its end and allowing one-step undo with saving on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "COPY MELODY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3045-3047",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3045-L3047"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3054-3070",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3054-L3070"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3083-3093",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3083-L3093"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3095-3116",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3095-L3116"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When BARS AS THE PROGRESSION is selected, immediately lengthens the shorter groove to the progression length, repeating its material where capacity permits, with undo and saving on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "MATCH BARS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3675-3699",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3675-L3699"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3701-3710",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3701-L3710"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When MEMORY is selected, opens the sixteen shared places.",
    "short_label": "MEMORY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3453-3455",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3453-L3455"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "release",
    "action": "When FACTORY RESET is selected while stopped, asks before immediately replacing all four songs, edited grooves, melodies, progressions and settings with defaults in flash, keeping calibration and the QY70 bank and offering no undo.",
    "short_label": "RESET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3399-3422",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3399-L3422"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "memory",
    "gesture": "release",
    "action": "For an occupied memory place while stopped, asks before freeing it and writing immediately; deleting a groove sends all songs using it back to their styles and cannot be undone, while only this song’s removed melody part or progressions enter its undo history and keeping recovered notes can require free memory.",
    "short_label": "FREE PLACE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3285-3319",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3285-L3319"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3324-3343",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3324-L3343"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3344-3359",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3344-L3359"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3364-3397",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3364-L3397"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4078-4089",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4078-L4089"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4573-4583",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4573-L4583"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "confirmation",
    "gesture": "release",
    "action": "For the edited-grooves question, retains the edited patterns without erasing them.",
    "short_label": "KEEP GROOVES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2288-2310",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2288-L2310"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2311-2330",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2311-L2330"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "short_label": "RESTORE",
    "action": "Commits the staged backup settings, songs, progressions, grooves and melody notes to flash at once without undo, removes objects absent from the file, and leaves calibration and the QY70 bank outside the restore.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-250",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L250"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/backup.c",
      "lines": "1-11",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/backup.c#L1-L11"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/backup.c",
      "lines": "460-479",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/backup.c#L460-L479"
     }
    ]
   },
   {
    "mode": "confirmation",
    "gesture": "release",
    "short_label": "AS WRITTEN",
    "action": "For the Notes bass question, changes this groove instrument’s Type to Chord 1 immediately without changing its notes, with one undo step and saving on SAVE or after four idle seconds while stopped and silent if an edited-groove memory place is available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "163-188",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L163-L188"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "216-221",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L216-L221"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "245-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L245-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "2688-2704",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L2688-L2704"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "169-180",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L169-L180"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "After one second held alone without keys or another use, shows this button’s help card and suppresses its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2055-2063",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2055-L2063"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "On an unused tap, toggles recording for what this page’s keys play, or reports that there is nothing to record.",
    "short_label": "RECORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1928-1971",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1928-L1971"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2001-2003",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2001-L2003"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "In Follow mode arms a new progression in the first empty place, otherwise toggles chord writing in the selected or playing progression, with undo and saving on SAVE or after four idle seconds while stopped and silent when storage is available; progression changes that exceed the songs’ shared room remain unkept if no memory place is free.",
    "short_label": "WRITE CHORDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1520-1544",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1520-L1544"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1244-1283",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1244-L1283"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1285-1304",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1285-L1304"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1307-1312",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1307-L1312"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "544-578",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L544-L578"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1523-1544",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1523-L1544"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Toggles chord writing into the shown progression, leaving Song or Follow mode for progression playback as needed, with undo and saving on SAVE or after four idle seconds while stopped and silent when storage is available; progression changes that exceed the songs’ shared room remain unkept if no memory place is free.",
    "short_label": "EDIT CHORDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1520-1544",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1520-L1544"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "544-578",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L544-L578"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1523-1544",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1523-L1544"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Toggles chord writing into the shown progression, leaving Song or Follow mode for progression playback as needed, with undo and saving on SAVE or after four idle seconds while stopped and silent when storage is available; progression changes that exceed the songs’ shared room remain unkept if no memory place is free.",
    "short_label": "EDIT CHORDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1520-1544",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1520-L1544"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "544-578",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L544-L578"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1523-1544",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1523-L1544"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "release",
    "action": "Toggles live section recording from HOME key shortcuts and mutes, with PLAY starting at section one when stopped and a playing transition into Song starting at the cursor on the next bar.",
    "short_label": "WRITE SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1707-1723",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1707-L1723"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1938-1940",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1938-L1940"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "release",
    "action": "Toggles live section recording from HOME key shortcuts and mutes, with PLAY starting at section one when stopped and a playing transition into Song starting at the cursor on the next bar.",
    "short_label": "WRITE SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1707-1723",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1707-L1723"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1938-1940",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1938-L1940"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Arms or ends an additive instrument or melody take from the next bar or PLAY’s count-in, saving on SAVE or after four idle seconds while stopped and silent only when storage is available; a style-groove take can sound unkept without a free memory place, and melody notes needing more room are discarded.",
    "short_label": "TRACK TAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1881-1898",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1881-L1898"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1928-1971",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1928-L1971"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "419-445",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L419-L445"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "486-508",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L486-L508"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1877-1898",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1877-L1898"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1928-1969",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1928-L1969"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Arms or ends an additive instrument or melody take from the next bar or PLAY’s count-in, saving on SAVE or after four idle seconds while stopped and silent only when storage is available; a style-groove take can sound unkept without a free memory place, and melody notes needing more room are discarded.",
    "short_label": "TRACK TAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1881-1898",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1881-L1898"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1928-1971",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1928-L1971"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "419-445",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L419-L445"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "486-508",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L486-L508"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1877-1898",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1877-L1898"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1928-1969",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1928-L1969"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Arms or ends an additive instrument or melody take from the next bar or PLAY’s count-in, saving on SAVE or after four idle seconds while stopped and silent only when storage is available; a style-groove take can sound unkept without a free memory place, and melody notes needing more room are discarded.",
    "short_label": "TRACK TAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1881-1898",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1881-L1898"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1928-1971",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1928-L1971"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "419-445",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L419-L445"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "486-508",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L486-L508"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1877-1898",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1877-L1898"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1928-1969",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1928-L1969"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Arms or ends an additive instrument or melody take from the next bar or PLAY’s count-in, saving on SAVE or after four idle seconds while stopped and silent only when storage is available; a style-groove take can sound unkept without a free memory place, and melody notes needing more room are discarded.",
    "short_label": "TRACK TAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1881-1898",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1881-L1898"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1928-1971",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1928-L1971"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "419-445",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L419-L445"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "486-508",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L486-L508"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1877-1898",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1877-L1898"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1928-1969",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1928-L1969"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Arms or ends an additive instrument or melody take from the next bar or PLAY’s count-in, saving on SAVE or after four idle seconds while stopped and silent only when storage is available; a style-groove take can sound unkept without a free memory place, and melody notes needing more room are discarded.",
    "short_label": "TRACK TAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1881-1898",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1881-L1898"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1928-1971",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1928-L1971"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "419-445",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L419-L445"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "486-508",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L486-L508"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1877-1898",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1877-L1898"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1928-1969",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1928-L1969"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "Reverses the latest available edit immediately without asking, with the restored state saved on SAVE or after four idle seconds while stopped and silent; switching songs, restarting, USB restore or a begun QY70 bank installation clears the history.",
    "short_label": "UNDO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4149-4156",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4149-L4156"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4483-4508",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4483-L4508"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4513-4525",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4513-L4525"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4573-4588",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4573-L4588"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2070-2088",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2070-L2088"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "755-778",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L755-L778"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2159-2185",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2159-L2185"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "After one second held alone without keys or another use, shows this button’s help card and suppresses its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2055-2063",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2055-L2063"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Moves the played keyboard octave down, within three octaves either way.",
    "short_label": "OCTAVE DOWN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2036-2052",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2036-L2052"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Moves the progression cursor one beat back.",
    "short_label": "BEAT BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2036-2040",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2036-L2040"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "947-988",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L947-L988"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Moves the progression cursor one beat back.",
    "short_label": "BEAT BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2036-2040",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2036-L2040"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "947-988",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L947-L988"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_oct_up",
    "short_label": "UPDATE",
    "action": "After both OCT buttons stay held for five seconds, stops audio and enters firmware installation mode without saving pending edits, so save first; releasing either during the countdown cancels entry.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "330-347",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L330-L347"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "172-181",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L172-L181"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "After one second held alone without keys or another use, shows this button’s help card and suppresses its release action.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2055-2063",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2055-L2063"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Moves the played keyboard octave up, within three octaves either way.",
    "short_label": "OCTAVE UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2036-2052",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2036-L2052"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Moves the progression cursor one beat forward.",
    "short_label": "BEAT NEXT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2036-2040",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2036-L2040"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "947-988",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L947-L988"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Moves the progression cursor one beat forward.",
    "short_label": "BEAT NEXT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2036-2040",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2036-L2040"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "947-988",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L947-L988"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_oct_down",
    "short_label": "UPDATE",
    "action": "After both OCT buttons stay held for five seconds, stops audio and enters firmware installation mode without saving pending edits, so save first; releasing either during the countdown cancels entry.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "330-347",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L330-L347"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "172-181",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L172-L181"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "After one second held alone, shows PLAY help after its transport action has already happened on press.",
    "short_label": "PLAY HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2055-2063",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2055-L2063"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4137-4159",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4137-L4159"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "action": "Starts or stops playback immediately, with a one-bar count-in when recording is armed; on Song it starts that song from section one or switches to it at the next bar.",
    "short_label": "PLAY STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1843-1873",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1843-L1873"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1900-1927",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1900-L1927"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "Reapplies the latest undone edit immediately without starting playback or asking, with the changed state saved on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "REDO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4149-4156",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4149-L4156"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4483-4508",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4483-L4508"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4513-4525",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4513-L4525"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4573-4588",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4573-L4588"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "short_label": "TRY AGAIN",
    "action": "Restarts Polly from scratch after the recovery page has been open for at least half a second.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-225",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L225"
     }
    ]
   }
  ],
  "encoder_select": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Moves to the next or previous page in the current button’s page group.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1832-1838",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1832-L1838"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4192-4204",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4192-L4204"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_home",
    "action": "Changes the song’s tempo and marks it as chosen by hand.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4192-4196",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4192-L4196"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "808-823",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L808-L823"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "turn",
    "action": "Moves through list rows, skipping the MORE heading.",
    "short_label": "LIST MOVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3982-4002",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3982-L4002"
     }
    ]
   },
   {
    "mode": "memory",
    "gesture": "turn",
    "action": "Moves through the sixteen memory places.",
    "short_label": "MEMORY PICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3982-4002",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3982-L4002"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "4710-4722",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L4710-L4722"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn",
    "action": "Selects notes in time order, including the separate pitches of a chord.",
    "short_label": "NOTE PICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "140-162",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L140-L162"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn_while_holding:button_sel",
    "action": "Moves the selected note by grid steps, allowing a melody note to cross into another section with that section’s chord root.",
    "short_label": "MOVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "120-147",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L120-L147"
     }
    ]
   },
   {
    "mode": "confirmation",
    "gesture": "turn",
    "action": "Does nothing while a question awaits its answer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4190-4192",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4190-L4192"
     }
    ]
   }
  ],
  "encoder_algorithm": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Selects D1, D2, PC, BA, C1–C4, M1 or M2, even on pages where the instrument selector is not printed.",
    "short_label": "INSTRUMENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4205-4210",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4205-L4210"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "875-913",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L875-L913"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "turn",
    "action": "Changes the selected setting, edits the current name letter, or chooses a progression, source section, destination song, writing step or USB audio level.",
    "short_label": "LIST VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4004-4075",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4004-L4075"
     }
    ]
   },
   {
    "mode": "memory",
    "gesture": "turn",
    "action": "Does nothing on memory-place rows.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4028-4075",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4028-L4075"
     }
    ]
   },
   {
    "mode": "confirmation",
    "gesture": "turn",
    "action": "Does nothing while a question awaits its answer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4190-4192",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4190-L4192"
     }
    ]
   }
  ],
  "encoder_presets": [
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_home",
    "action": "Chooses one of four songs, saving pending work before switching and saving the selection immediately; during playback the switch waits until stop and loading the song clears undo.",
    "short_label": "SONG PICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3915-3920",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3915-L3920"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2332-2345",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2332-L2345"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2070-2092",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2070-L2092"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "turn",
    "action": "Selects the next or previous progression and enters progression playback, with a playing change taking effect at the next bar.",
    "short_label": "PROGRESSION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3915-3928",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3915-L3928"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1340-1357",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1340-L1357"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "turn",
    "action": "Selects the next or previous progression and enters progression playback, with a playing change taking effect at the next bar.",
    "short_label": "PROGRESSION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3915-3928",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3915-L3928"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1340-1357",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1340-L1357"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "turn",
    "action": "Selects the next or previous progression and enters progression playback, with a playing change taking effect at the next bar.",
    "short_label": "PROGRESSION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3915-3928",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3915-L3928"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1340-1357",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1340-L1357"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Moves the section cursor, including END, and stops it following playback.",
    "short_label": "SECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3928-3932",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3928-L3932"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "turn",
    "action": "Moves the section cursor, including END, and stops it following playback.",
    "short_label": "SECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3928-3932",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3928-L3932"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn",
    "action": "Changes the visible window between eight, four, two and one bars, with a one-beat view also available for band instruments.",
    "short_label": "ZOOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3932-3934",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3932-L3934"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "turn",
    "action": "Selects an edited groove or style pattern for the current section, saving pending edits first while stopped and refusing unsaved replacements during playback.",
    "short_label": "GROOVE PICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3934-3936",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3934-L3936"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2095-2144",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2095-L2144"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "turn",
    "action": "Selects an edited groove or style pattern for the current section, saving pending edits first while stopped and refusing unsaved replacements during playback.",
    "short_label": "GROOVE PICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3934-3936",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3934-L3936"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2095-2144",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2095-L2144"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "turn",
    "action": "Chooses the song’s style, initially keeping edited grooves and asking about them after the turn rests.",
    "short_label": "STYLE PICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3936-3939",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3936-L3939"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2243-2271",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2243-L2271"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2288-2310",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2288-L2310"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2311-2330",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2311-L2330"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "turn",
    "action": "Chooses the song’s style, initially keeping edited grooves and asking about them after the turn rests.",
    "short_label": "STYLE PICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3936-3939",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3936-L3939"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2243-2271",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2243-L2271"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2288-2310",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2288-L2310"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2311-2330",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2311-L2330"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "turn",
    "action": "Moves to a General MIDI family of eight sounds for the selected instrument or melody, with previews where permitted; drum-channel parts are unchanged.",
    "short_label": "FAMILY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3939-3957",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3939-L3957"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "turn",
    "action": "Does nothing unless HOME is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3915-3959",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3915-L3959"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Does nothing unless HOME is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3915-3959",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3915-L3959"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "turn",
    "action": "Does nothing unless HOME is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3915-3959",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3915-L3959"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "turn",
    "action": "Does nothing unless HOME is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3915-3959",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3915-L3959"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "turn",
    "action": "Does nothing unless HOME is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3915-3959",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3915-L3959"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "turn",
    "action": "Does nothing unless HOME is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3915-3959",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3915-L3959"
     }
    ]
   },
   {
    "mode": "confirmation",
    "gesture": "turn",
    "action": "Does nothing while a question awaits its answer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4190-4192",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4190-L4192"
     }
    ]
   }
  ],
  "encoder_knob1": [
   {
    "mode": "confirmation",
    "gesture": "turn",
    "action": "Does nothing while a question awaits its answer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4190-4192",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4190-L4192"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "turn",
    "action": "Changes the song’s style while initially retaining edited grooves; after 900 milliseconds at rest a question offers to keep them or return to the new style.",
    "short_label": "STYLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2233-2259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2233-L2259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2260-2271",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2260-L2271"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2311-2330",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2311-L2330"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Moves the section cursor through the song and END.",
    "short_label": "SECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1742-1745",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1742-L1745"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "turn",
    "action": "Transposes the selected section from minus six to plus five semitones.",
    "short_label": "SECTION KEY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1777-1779",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1777-L1779"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "turn",
    "action": "Moves the progression cursor by bars.",
    "short_label": "BAR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2379-2391",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2379-L2391"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "turn",
    "action": "Changes progression length within its 64-beat limit, retaining hidden chords only while the same progression stays open so lengthening can recover them, without asking and with undo, saved on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2393-2415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2393-L2415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2416-2435",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2416-L2435"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "turn",
    "action": "Chooses eighth, eighth-triplet, sixteenth, sixteenth-triplet, thirty-second or unquantised recording.",
    "short_label": "REC GRID",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3551-3559",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3551-L3559"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "turn",
    "action": "Changes the groove’s bar count, repeating existing material when lengthening where space permits and saving the edit on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "GROOVE BARS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3675-3699",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3675-L3699"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "turn",
    "action": "Chooses the instrument or melody’s General MIDI sound, except on the drum channel, and requests an audition where permitted.",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3773-3779",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3773-L3779"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3849-3855",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3849-L3855"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "turn",
    "action": "Sets the root above which a band instrument drops an octave, or disables that threshold, including the stored value hidden for drums.",
    "short_label": "HIGH KEY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3863-3867",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3863-L3867"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Changes the selected instrument or melody volume.",
    "short_label": "VOLUME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3869-3872",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3869-L3872"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3785-3796",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3785-L3796"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "turn",
    "action": "Changes the selected instrument or melody brightness, with 64 neutral.",
    "short_label": "BRIGHTNESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3874-3879",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3874-L3879"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3785-3796",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3785-L3796"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "turn",
    "action": "Chooses off or one of four shared reverb spaces.",
    "short_label": "REVERB TYPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3881-3887",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3881-L3887"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "turn",
    "action": "Chooses the pattern for this section, saving its pending edits first when stopped and requiring SAVE first if it has unsaved edits during playback.",
    "short_label": "INTRO PICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2356-2362",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2356-L2362"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2108-2144",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2108-L2144"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "turn",
    "action": "Chooses the pattern for this section, saving its pending edits first when stopped and requiring SAVE first if it has unsaved edits during playback.",
    "short_label": "FILL AB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2356-2362",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2356-L2362"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2108-2144",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2108-L2144"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "turn",
    "action": "Chooses internal timing or following incoming MIDI clock.",
    "short_label": "CLOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2364-2376",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2364-L2376"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "turn",
    "action": "Does nothing on Status.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3894-3907",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3894-L3907"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn",
    "action": "Moves the Notes cursor by grid steps, including empty places.",
    "short_label": "PLACE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "189-230",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L189-L230"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn_while_holding:button_sel",
    "action": "Moves the selected note by grid steps as an undoable edit saved on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "MOVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "189-197",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L189-L197"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "120-138",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L120-L138"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   }
  ],
  "encoder_knob2": [
   {
    "mode": "confirmation",
    "gesture": "turn",
    "action": "Does nothing while a question awaits its answer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4190-4192",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4190-L4192"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "turn",
    "action": "Sets the song tempo by hand so subsequent style changes retain it.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "808-823",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L808-L823"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Chooses the section’s progression; below P1 marks it for removal on leaving Song, asking only if marked sections contain melody notes, with undo and saving on SAVE or after four idle seconds while stopped and silent, while turning back up keeps it and a clockwise turn at END appends a section.",
    "short_label": "PROG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1747-1782",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1747-L1782"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2580-2584",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2580-L2584"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2604-2623",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2604-L2623"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2631-2668",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2631-L2668"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "turn",
    "action": "Turns the song’s opening Intro on or off.",
    "short_label": "INTRO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1733-1740",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1733-L1740"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "turn",
    "action": "Moves the cursor within the current bar.",
    "short_label": "BEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2379-2391",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2379-L2391"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "turn",
    "action": "Changes the progression’s beats per bar from two to seven, possibly shortening it to fit 64 beats and retaining hidden chords only while this progression remains open, without asking and with undo, saved on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "BEATS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2393-2415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2393-L2415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2416-2435",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2416-L2435"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "turn",
    "action": "Moves the groove’s cursor by bars.",
    "short_label": "BAR CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3812-3819",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3812-L3819"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "turn",
    "action": "Changes the groove meter from two to seven beats per bar.",
    "short_label": "GROOVE BEATS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3831-3836",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3831-L3836"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "turn",
    "action": "For a band instrument, changes its chord-following rule; for a melody, sets MIDI channel one through fifteen.",
    "short_label": "CHORD RULE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3849-3857",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3849-L3857"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3773-3784",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3773-L3784"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "turn",
    "action": "Sets the selected band instrument’s MIDI channel from one through fifteen.",
    "short_label": "MIDI CHANNEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3863-3867",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3863-L3867"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Changes the selected instrument or melody pan.",
    "short_label": "PAN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3869-3872",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3869-L3872"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3785-3796",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3785-L3796"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "turn",
    "action": "Changes the selected instrument or melody resonance, with 64 neutral.",
    "short_label": "RESONANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3874-3879",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3874-L3879"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3785-3796",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3785-L3796"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "turn",
    "action": "Changes the shared reverb level.",
    "short_label": "REVERB LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3881-3887",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3881-L3887"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "turn",
    "action": "Chooses the pattern for this section, saving its pending edits first when stopped and requiring SAVE first if it has unsaved edits during playback.",
    "short_label": "GROOVE A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2356-2362",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2356-L2362"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2108-2144",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2108-L2144"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "turn",
    "action": "Chooses the pattern for this section, saving its pending edits first when stopped and requiring SAVE first if it has unsaved edits during playback.",
    "short_label": "FILL BA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2356-2362",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2356-L2362"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2108-2144",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2108-L2144"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "turn",
    "action": "Turns USB MIDI output on or off.",
    "short_label": "MIDI OUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2364-2376",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2364-L2376"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "turn",
    "action": "Does nothing on Status.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3894-3907",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3894-L3907"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn",
    "action": "Changes the selected note’s pitch while skipping duplicates at that place, and can ask whether a bass instrument should use Chord 1 so the edited note is heard as written.",
    "short_label": "PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "189-230",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L189-L230"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "163-188",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L163-L188"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "216-221",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L216-L221"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "245-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L245-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "2688-2704",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L2688-L2704"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "169-180",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L169-L180"
     }
    ]
   }
  ],
  "encoder_knob3": [
   {
    "mode": "confirmation",
    "gesture": "turn",
    "action": "Does nothing while a question awaits its answer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4190-4192",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4190-L4192"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "turn",
    "action": "Changes song transpose by semitones.",
    "short_label": "TRANSPOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "830-844",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L830-L844"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Chooses the section’s groove and fill behavior.",
    "short_label": "GROOVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1783-1785",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1783-L1785"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "turn",
    "action": "Chooses whether the song plays its Ending.",
    "short_label": "ENDING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1733-1740",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1733-L1740"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "turn",
    "action": "Changes or writes the chord root at the cursor.",
    "short_label": "ROOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1047-1076",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1047-L1076"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "turn",
    "action": "Sets or removes the chord’s separate bass note immediately without asking, with undo and saving on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "SLASH BASS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1067-1076",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1067-L1076"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "turn",
    "action": "Moves the groove’s cursor within the current bar.",
    "short_label": "BEAT CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3812-3819",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3812-L3819"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "turn",
    "action": "Selects one of eight groove-name positions.",
    "short_label": "NAME PLACE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3837-3838",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3837-L3838"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "turn",
    "action": "Sets a band instrument’s lower range limit, even when hidden for drums; for a melody it does nothing.",
    "short_label": "LOW NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3858-3861",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3858-L3861"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3773-3784",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3773-L3784"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "turn",
    "action": "Does nothing on Sound 2.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3863-3868",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3863-L3868"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Changes the selected instrument or melody reverb send.",
    "short_label": "REVERB SEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3869-3872",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3869-L3872"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3785-3796",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3785-L3796"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "turn",
    "action": "Does nothing on Mixer tone.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3874-3880",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3874-L3880"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3785-3796",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3785-L3796"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "turn",
    "action": "Chooses one of four shared chorus types.",
    "short_label": "CHORUS TYPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3881-3887",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3881-L3887"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "turn",
    "action": "Chooses the pattern for this section, saving its pending edits first when stopped and requiring SAVE first if it has unsaved edits during playback.",
    "short_label": "GROOVE B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2356-2362",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2356-L2362"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2108-2144",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2108-L2144"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "turn",
    "action": "Chooses the pattern for this section, saving its pending edits first when stopped and requiring SAVE first if it has unsaved edits during playback.",
    "short_label": "ENDING PICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2356-2362",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2356-L2362"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2108-2144",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2108-L2144"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "turn",
    "action": "Chooses off, on or notes for the key and button lighting behavior.",
    "short_label": "LIGHTS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2364-2376",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2364-L2376"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "turn",
    "action": "Does nothing on Status.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3894-3907",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3894-L3907"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn",
    "action": "Changes the selected note’s length in grid steps.",
    "short_label": "NOTE LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "189-230",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L189-L230"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn_while_holding:button_sel",
    "action": "Changes the selected note’s length in steps of one forty-eighth of a beat as an undoable edit saved on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "FINE LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "222-230",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L222-L230"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   }
  ],
  "encoder_knob4": [
   {
    "mode": "confirmation",
    "gesture": "turn",
    "action": "Does nothing while a question awaits its answer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4190-4192",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4190-L4192"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "turn",
    "action": "Chooses Follow or a progression, leaving Song playback when turned and applying a playing mode change at the next bar.",
    "short_label": "PROGRESSION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3561-3579",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3561-L3579"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Sets section repeats from one to eight.",
    "short_label": "REPEATS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1786-1802",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1786-L1802"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "turn",
    "action": "Chooses stopping or restarting when the song ends.",
    "short_label": "AT END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1733-1740",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1733-L1740"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "turn",
    "action": "Changes the chord type, with the position below major removing the change at this beat immediately without a question as an undoable edit saved on SAVE or after four idle seconds while stopped and silent.",
    "short_label": "CHORD TYPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1047-1076",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1047-L1076"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "245-259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L245-L259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4464-4482",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4464-L4482"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "turn",
    "action": "Chooses a progression name preset or its numbered default.",
    "short_label": "PROG NAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2429-2433",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2429-L2433"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "turn",
    "action": "Toggles the selected part’s mute once per turn burst, for the song outside Song mode or its current section in Song mode.",
    "short_label": "MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3820-3826",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3820-L3826"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "turn",
    "action": "Changes the groove name’s selected character.",
    "short_label": "GROOVE NAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3839-3846",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3839-L3846"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "turn",
    "action": "Sets a band instrument’s upper range limit, even when hidden for drums; for a melody it sets the velocity of future recorded notes.",
    "short_label": "HIGH NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3858-3861",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3858-L3861"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3773-3784",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3773-L3784"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "turn",
    "action": "Does nothing on Sound 2.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3863-3868",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3863-L3868"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Changes the selected instrument or melody chorus send.",
    "short_label": "CHORUS SEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3869-3872",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3869-L3872"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3785-3796",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3785-L3796"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "turn",
    "action": "Does nothing on Mixer tone.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3874-3880",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3874-L3880"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3785-3796",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3785-L3796"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "turn",
    "action": "Changes the shared chorus level.",
    "short_label": "CHORUS LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3881-3887",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3881-L3887"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "turn",
    "action": "Changes the song’s style while initially retaining edited grooves, followed by a question after the turn rests.",
    "short_label": "STYLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2356-2362",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2356-L2362"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2243-2271",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2243-L2271"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2311-2330",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2311-L2330"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "turn",
    "action": "Changes the song’s style while initially retaining edited grooves, followed by a question after the turn rests.",
    "short_label": "STYLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2356-2362",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2356-L2362"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2243-2271",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2243-L2271"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2311-2330",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2311-L2330"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "turn",
    "action": "Chooses off, recording only or always on for the metronome, while recording count-ins still click.",
    "short_label": "CLICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2364-2376",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2364-L2376"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "turn",
    "action": "Does nothing on Status.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3894-3907",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3894-L3907"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn",
    "action": "Changes the selected note’s velocity from one to 127.",
    "short_label": "VELOCITY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "189-230",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L189-L230"
     }
    ]
   }
  ],
  "key_f3": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds F3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "F3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds F3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD F3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds F3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD F3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays F3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays F3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays F3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays F3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays F3 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Inserts a section using P1 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Inserts a section using P1 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "If section recording is armed in Song mode, inserts a section using P1 at the cursor and shifts later sections while stopped, or replaces the current or next section’s progression or appends at the end while playing; otherwise selects P1 for the next bar or start, choosing Follow if already selected, with questions blocking either case.",
    "short_label": "PLAY P1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1338-1353",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1338-L1353"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1360-1366",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1360-L1366"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1650-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1650-L1693"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1588-1617",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1588-L1617"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1654-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1654-L1693"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P1 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P1 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P1 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 1 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 1 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_fs3": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds F#3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "F#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds F#3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD F#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds F#3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD F#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays F#3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays F#3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays F#3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays F#3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays F#3 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Toggles D1 in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE D1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Toggles D1 in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE D1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Selects D1 for editing and keyboard playing.",
    "short_label": "PICK D1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Selects D1 for editing and keyboard playing.",
    "short_label": "PICK D1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "Queues Intro for the next bar while playing or the next start when stopped, unless a confirmation question is open.",
    "short_label": "INTRO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1355-1380",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1355-L1380"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1695-1705",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1695-L1705"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "1343-1364",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L1343-L1364"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "1720-1756",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L1720-L1756"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_g3": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds G3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "G3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds G3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD G3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds G3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD G3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays G3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays G3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays G3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays G3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays G3 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Inserts a section using P2 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Inserts a section using P2 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "If section recording is armed in Song mode, inserts a section using P2 at the cursor and shifts later sections while stopped, or replaces the current or next section’s progression or appends at the end while playing; otherwise selects P2 for the next bar or start, choosing Follow if already selected, with questions blocking either case.",
    "short_label": "PLAY P2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1338-1353",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1338-L1353"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1360-1366",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1360-L1366"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1650-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1650-L1693"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1588-1617",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1588-L1617"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1654-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1654-L1693"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P2 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P2 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P2 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 2 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 2 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_gs3": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds G#3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "G#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds G#3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD G#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds G#3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD G#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays G#3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays G#3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays G#3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays G#3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays G#3 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Toggles D2 in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE D2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Toggles D2 in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE D2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Selects D2 for editing and keyboard playing.",
    "short_label": "PICK D2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Selects D2 for editing and keyboard playing.",
    "short_label": "PICK D2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "Queues Groove A for the next bar while playing or the next start when stopped; while section recording is armed it also writes this groove into the section, unless a confirmation question is open.",
    "short_label": "GROOVE A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1355-1380",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1355-L1380"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1695-1705",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1695-L1705"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "1343-1364",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L1343-L1364"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "1720-1756",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L1720-L1756"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_a3": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds A3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "A3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds A3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD A3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds A3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD A3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays A3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE A3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays A3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE A3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays A3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE A3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays A3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE A3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays A3 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Inserts a section using P3 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Inserts a section using P3 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "If section recording is armed in Song mode, inserts a section using P3 at the cursor and shifts later sections while stopped, or replaces the current or next section’s progression or appends at the end while playing; otherwise selects P3 for the next bar or start, choosing Follow if already selected, with questions blocking either case.",
    "short_label": "PLAY P3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1338-1353",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1338-L1353"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1360-1366",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1360-L1366"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1650-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1650-L1693"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1588-1617",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1588-L1617"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1654-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1654-L1693"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P3 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P3 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P3 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 3 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 3 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_as3": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds A#3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "A#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds A#3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD A#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds A#3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD A#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays A#3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE A#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays A#3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE A#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays A#3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE A#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays A#3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE A#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays A#3 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Toggles PC in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE PC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Toggles PC in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE PC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Selects PC for editing and keyboard playing.",
    "short_label": "PICK PC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Selects PC for editing and keyboard playing.",
    "short_label": "PICK PC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "Queues Groove B for the next bar while playing or the next start when stopped; while section recording is armed it also writes this groove into the section, unless a confirmation question is open.",
    "short_label": "GROOVE B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1355-1380",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1355-L1380"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1695-1705",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1695-L1705"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "1343-1364",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L1343-L1364"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "1720-1756",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L1720-L1756"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_b3": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds B3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "B3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds B3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD B3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds B3 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD B3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays B3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE B3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays B3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE B3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays B3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE B3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays B3 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE B3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays B3 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Inserts a section using P4 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Inserts a section using P4 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "If section recording is armed in Song mode, inserts a section using P4 at the cursor and shifts later sections while stopped, or replaces the current or next section’s progression or appends at the end while playing; otherwise selects P4 for the next bar or start, choosing Follow if already selected, with questions blocking either case.",
    "short_label": "PLAY P4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1338-1353",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1338-L1353"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1360-1366",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1360-L1366"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1650-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1650-L1693"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1588-1617",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1588-L1617"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1654-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1654-L1693"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P4 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P4 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P4 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 4 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 4 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_c4": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds C4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds C4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds C4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays C4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays C4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays C4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays C4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays C4 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Inserts a section using P5 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Inserts a section using P5 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "If section recording is armed in Song mode, inserts a section using P5 at the cursor and shifts later sections while stopped, or replaces the current or next section’s progression or appends at the end while playing; otherwise selects P5 for the next bar or start, choosing Follow if already selected, with questions blocking either case.",
    "short_label": "PLAY P5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1338-1353",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1338-L1353"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1360-1366",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1360-L1366"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1650-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1650-L1693"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1588-1617",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1588-L1617"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1654-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1654-L1693"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P5 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P5 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P5 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 5 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 5 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_cs4": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds C#4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "C#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds C#4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD C#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds C#4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD C#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays C#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE C#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays C#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE C#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays C#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE C#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays C#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE C#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays C#4 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Toggles BA in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE BA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Toggles BA in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE BA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Selects BA for editing and keyboard playing.",
    "short_label": "PICK BA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Selects BA for editing and keyboard playing.",
    "short_label": "PICK BA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "Queues Fill for the next bar while playing or the next start when stopped; a Fill goes toward B from A or toward A from B and is refused during an Intro or Ending, unless a confirmation question is open.",
    "short_label": "FILL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1355-1380",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1355-L1380"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1695-1705",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1695-L1705"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "1343-1364",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L1343-L1364"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "1720-1756",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L1720-L1756"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_d4": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds D4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "D4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds D4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD D4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds D4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD D4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays D4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE D4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays D4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE D4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays D4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE D4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays D4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE D4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays D4 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Inserts a section using P6 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Inserts a section using P6 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "If section recording is armed in Song mode, inserts a section using P6 at the cursor and shifts later sections while stopped, or replaces the current or next section’s progression or appends at the end while playing; otherwise selects P6 for the next bar or start, choosing Follow if already selected, with questions blocking either case.",
    "short_label": "PLAY P6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1338-1353",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1338-L1353"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1360-1366",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1360-L1366"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1650-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1650-L1693"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1588-1617",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1588-L1617"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1654-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1654-L1693"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P6 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P6 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P6 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 6 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 6 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_ds4": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds D#4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "D#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds D#4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD D#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds D#4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD D#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays D#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE D#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays D#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE D#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays D#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE D#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays D#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE D#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays D#4 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Toggles C1 in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE C1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Toggles C1 in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE C1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Selects C1 for editing and keyboard playing.",
    "short_label": "PICK C1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Selects C1 for editing and keyboard playing.",
    "short_label": "PICK C1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "Queues Ending for the next bar while playing or the next start when stopped, unless a confirmation question is open.",
    "short_label": "ENDING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1355-1380",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1355-L1380"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1695-1705",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1695-L1705"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "1343-1364",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L1343-L1364"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "1720-1756",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L1720-L1756"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_e4": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds E4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "E4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds E4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD E4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds E4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD E4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays E4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE E4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays E4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE E4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays E4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE E4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays E4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE E4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays E4 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Inserts a section using P7 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Inserts a section using P7 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "If section recording is armed in Song mode, inserts a section using P7 at the cursor and shifts later sections while stopped, or replaces the current or next section’s progression or appends at the end while playing; otherwise selects P7 for the next bar or start, choosing Follow if already selected, with questions blocking either case.",
    "short_label": "PLAY P7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1338-1353",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1338-L1353"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1360-1366",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1360-L1366"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1650-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1650-L1693"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1588-1617",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1588-L1617"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1654-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1654-L1693"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P7 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P7 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P7 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 7 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 7 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_f4": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds F4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "F4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds F4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD F4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds F4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD F4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays F4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays F4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays F4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays F4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays F4 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Inserts a section using P8 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Inserts a section using P8 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "If section recording is armed in Song mode, inserts a section using P8 at the cursor and shifts later sections while stopped, or replaces the current or next section’s progression or appends at the end while playing; otherwise selects P8 for the next bar or start, choosing Follow if already selected, with questions blocking either case.",
    "short_label": "PLAY P8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1338-1353",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1338-L1353"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1360-1366",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1360-L1366"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1650-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1650-L1693"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1588-1617",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1588-L1617"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1654-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1654-L1693"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P8 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P8 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P8 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 8 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 8 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_fs4": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds F#4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "F#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds F#4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD F#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds F#4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD F#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays F#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays F#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays F#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays F#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays F#4 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Toggles C2 in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE C2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Toggles C2 in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE C2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Selects C2 for editing and keyboard playing.",
    "short_label": "PICK C2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Selects C2 for editing and keyboard playing.",
    "short_label": "PICK C2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "Does nothing while HOME is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1355-1380",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1355-L1380"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_g4": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds G4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "G4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds G4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD G4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds G4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD G4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays G4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays G4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays G4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays G4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays G4 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Inserts a section using P9 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Inserts a section using P9 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "If section recording is armed in Song mode, inserts a section using P9 at the cursor and shifts later sections while stopped, or replaces the current or next section’s progression or appends at the end while playing; otherwise selects P9 for the next bar or start, choosing Follow if already selected, with questions blocking either case.",
    "short_label": "PLAY P9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1338-1353",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1338-L1353"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1360-1366",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1360-L1366"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1650-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1650-L1693"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1588-1617",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1588-L1617"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1654-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1654-L1693"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P9 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P9 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P9 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 9 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 9 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_gs4": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds G#4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "G#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds G#4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD G#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds G#4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD G#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays G#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays G#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays G#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays G#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays G#4 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Toggles C3 in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE C3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Toggles C3 in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE C3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Selects C3 for editing and keyboard playing.",
    "short_label": "PICK C3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Selects C3 for editing and keyboard playing.",
    "short_label": "PICK C3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "Does nothing while HOME is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1355-1380",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1355-L1380"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_a4": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds A4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "A4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds A4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD A4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds A4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD A4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays A4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE A4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays A4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE A4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays A4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE A4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays A4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE A4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays A4 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Inserts a section using P10 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Inserts a section using P10 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "If section recording is armed in Song mode, inserts a section using P10 at the cursor and shifts later sections while stopped, or replaces the current or next section’s progression or appends at the end while playing; otherwise selects P10 for the next bar or start, choosing Follow if already selected, with questions blocking either case.",
    "short_label": "PLAY P10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1338-1353",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1338-L1353"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1360-1366",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1360-L1366"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1650-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1650-L1693"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1588-1617",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1588-L1617"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1654-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1654-L1693"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P10 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P10 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P10 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 10 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 10 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_as4": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds A#4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "A#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds A#4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD A#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds A#4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD A#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays A#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE A#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays A#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE A#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays A#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE A#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays A#4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE A#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays A#4 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Toggles C4 in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Toggles C4 in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Selects C4 for editing and keyboard playing.",
    "short_label": "PICK C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Selects C4 for editing and keyboard playing.",
    "short_label": "PICK C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "Does nothing while HOME is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1355-1380",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1355-L1380"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_b4": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds B4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "B4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds B4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD B4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds B4 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD B4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays B4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE B4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays B4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE B4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays B4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE B4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays B4 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE B4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays B4 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Inserts a section using P11 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Inserts a section using P11 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "If section recording is armed in Song mode, inserts a section using P11 at the cursor and shifts later sections while stopped, or replaces the current or next section’s progression or appends at the end while playing; otherwise selects P11 for the next bar or start, choosing Follow if already selected, with questions blocking either case.",
    "short_label": "PLAY P11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1338-1353",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1338-L1353"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1360-1366",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1360-L1366"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1650-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1650-L1693"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1588-1617",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1588-L1617"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1654-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1654-L1693"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P11 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P11 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P11 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 11 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 11 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_c5": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds C5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "C5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds C5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD C5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds C5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD C5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays C5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE C5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays C5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE C5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays C5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE C5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays C5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE C5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays C5 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Inserts a section using P12 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Inserts a section using P12 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "If section recording is armed in Song mode, inserts a section using P12 at the cursor and shifts later sections while stopped, or replaces the current or next section’s progression or appends at the end while playing; otherwise selects P12 for the next bar or start, choosing Follow if already selected, with questions blocking either case.",
    "short_label": "PLAY P12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1338-1353",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1338-L1353"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1360-1366",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1360-L1366"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1650-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1650-L1693"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1588-1617",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1588-L1617"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1654-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1654-L1693"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P12 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P12 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P12 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 12 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 12 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_cs5": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds C#5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "C#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds C#5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD C#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds C#5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD C#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays C#5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE C#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays C#5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE C#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays C#5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE C#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays C#5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE C#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays C#5 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Toggles M1 in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE M1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Toggles M1 in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE M1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Selects M1 for editing and keyboard playing.",
    "short_label": "PICK M1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Selects M1 for editing and keyboard playing.",
    "short_label": "PICK M1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "Does nothing while HOME is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1355-1380",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1355-L1380"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_d5": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds D5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "D5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds D5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD D5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds D5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD D5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays D5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE D5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays D5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE D5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays D5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE D5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays D5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE D5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays D5 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Inserts a section using P13 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Inserts a section using P13 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "If section recording is armed in Song mode, inserts a section using P13 at the cursor and shifts later sections while stopped, or replaces the current or next section’s progression or appends at the end while playing; otherwise selects P13 for the next bar or start, choosing Follow if already selected, with questions blocking either case.",
    "short_label": "PLAY P13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1338-1353",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1338-L1353"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1360-1366",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1360-L1366"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1650-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1650-L1693"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1588-1617",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1588-L1617"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1654-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1654-L1693"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P13 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P13 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P13 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 13 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 13 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_ds5": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds D#5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "D#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds D#5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD D#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds D#5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD D#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays D#5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE D#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays D#5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE D#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays D#5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE D#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays D#5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE D#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays D#5 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Toggles M2 in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE M2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Toggles M2 in the section at the song cursor, or the playing section during section recording, with an immediate change when that section is sounding and no change at END.",
    "short_label": "MUTE M2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1618-1648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1618-L1648"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Selects M2 for editing and keyboard playing.",
    "short_label": "PICK M2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Selects M2 for editing and keyboard playing.",
    "short_label": "PICK M2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "873-890",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L873-L890"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "Does nothing while HOME is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1355-1380",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1355-L1380"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_e5": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds E5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "E5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds E5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD E5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds E5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD E5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays E5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE E5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays E5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE E5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays E5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE E5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays E5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE E5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays E5 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Inserts a section using P14 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Inserts a section using P14 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "If section recording is armed in Song mode, inserts a section using P14 at the cursor and shifts later sections while stopped, or replaces the current or next section’s progression or appends at the end while playing; otherwise selects P14 for the next bar or start, choosing Follow if already selected, with questions blocking either case.",
    "short_label": "PLAY P14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1338-1353",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1338-L1353"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1360-1366",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1360-L1366"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1650-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1650-L1693"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1588-1617",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1588-L1617"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1654-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1654-L1693"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P14 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P14 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P14 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 14 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 14 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_f5": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds F5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "F5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds F5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD F5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds F5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD F5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays F5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays F5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays F5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays F5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays F5 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Inserts a section using P15 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Inserts a section using P15 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "If section recording is armed in Song mode, inserts a section using P15 at the cursor and shifts later sections while stopped, or replaces the current or next section’s progression or appends at the end while playing; otherwise selects P15 for the next bar or start, choosing Follow if already selected, with questions blocking either case.",
    "short_label": "PLAY P15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1338-1353",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1338-L1353"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1360-1366",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1360-L1366"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1650-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1650-L1693"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1588-1617",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1588-L1617"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1654-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1654-L1693"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P15 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P15 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P15 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 15 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 15 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_fs5": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds F#5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "F#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds F#5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD F#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds F#5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD F#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays F#5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays F#5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays F#5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays F#5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE F#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays F#5 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Does nothing on the Song pages.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1632",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1632"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Does nothing on the Song pages.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1632",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1632"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing on the Mixer pages.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing on the Mixer pages.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "Does nothing while HOME is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1355-1380",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1355-L1380"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "key_g5": [
   {
    "mode": "home",
    "gesture": "press",
    "action": "Adds G5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "G5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press",
    "action": "Adds G5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD G5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press",
    "action": "Adds G5 at octave zero, shifted by OCT and Transpose, to the held chord; three recognised notes steer the band and REC writes the chord at the cursor when stopped or on the nearest beat while playing.",
    "short_label": "CHORD G5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1493-1496",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1493-L1496"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "115-130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L115-L130"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1131-1194",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1131-L1194"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "release",
    "action": "Ends this stopped audition note while leaving the recognised chord in place, and advances the stopped recording cursor by STEP when the last chord key is released.",
    "short_label": "CHORD UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1394-1415",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1394-L1415"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1196-1218",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1196-L1218"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "123-129",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L123-L129"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press",
    "action": "Plays G5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press",
    "action": "Plays G5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press",
    "action": "Plays G5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press",
    "action": "Plays G5 at octave zero through the selected instrument or melody, shifted by OCT and Transpose, with fixed velocity 100 for an instrument or the melody velocity, and records it when recording is running.",
    "short_label": "NOTE G5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "139-143",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L139-L143"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1500",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1500"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "release",
    "action": "Ends the held note and its recorded length if it is being recorded.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "947-964",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L947-L964"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Plays G5 shifted by OCT and Transpose, adds a grid-length note at an empty cursor when unarmed and not recording, joins keys held together into a chord there, or records the note normally during recording.",
    "short_label": "ENTER NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1497-1502",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1497-L1502"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "243-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L243-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "938-983",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L938-L983"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Ends this held note and advances the insertion cursor one grid step when the last key of a newly entered chord is released.",
    "short_label": "NOTES UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1477-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1477-L1506"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Inserts a section using P16 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press",
    "action": "Inserts a section using P16 at the song cursor and advances it, up to 32 sections, refusing an insertion at or before the playing section.",
    "short_label": "ADD P16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1585-1616",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1585-L1616"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1623-1629",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1623-L1629"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press",
    "action": "Does nothing without HOME or SAVE held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1384-1392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1384-L1392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1503-1506",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1503-L1506"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_home",
    "action": "If section recording is armed in Song mode, inserts a section using P16 at the cursor and shifts later sections while stopped, or replaces the current or next section’s progression or appends at the end while playing; otherwise selects P16 for the next bar or start, choosing Follow if already selected, with questions blocking either case.",
    "short_label": "PLAY P16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1338-1353",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1338-L1353"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1360-1366",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1360-L1366"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1482-1488",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1482-L1488"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1650-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1650-L1693"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1588-1617",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1588-L1617"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1654-1693",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1654-L1693"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P16 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P16 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current progression into P16 after asking if it holds chords, changes it now with undo available, and stores it on SAVE or after four idle seconds with playback and sound stopped; choosing itself changes nothing.",
    "short_label": "COPY P16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3462-3473",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3462-L3473"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3529",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3529"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4262-4276",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 16 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "press_while_holding:button_save",
    "action": "Copies the current groove straight to memory 16 only when stopped, asks before replacing another groove with notes, refuses melody or progression storage, and writes at once without undo.",
    "short_label": "COPY SLOT 16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3475-3510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3475-L3510"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3530-3546",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3530-L3546"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Does nothing and uses up the SAVE tap, so releasing SAVE does not save.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press_while_holding:button_save",
    "action": "Shows COPY / ON HOME, ARP, SEQ without copying or saving, and consumes the held SAVE tap so its release does not save.",
    "short_label": "COPY REFUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1489-1492",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1489-L1492"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3547-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3547-L3548"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "3514-3548",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3514-L3548"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Completes the job assigned when this key went down, even if the page has since changed, ending any held note or updating held chords and insertion position.",
    "short_label": "KEY UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "1508-1518",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L1508-L1518"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "257-268",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L257-L268"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "212-235",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L212-L235"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "press",
    "action": "Does nothing on this recovery or restore screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "knob_master": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Changes the speaker and headphone level and also USB recording level unless USB AUDIO is set to full.",
    "short_label": "MASTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "322-328",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L322-L328"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "35-48",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L35-L48"
     }
    ]
   }
  ],
  "screen": [
   {
    "mode": "home",
    "gesture": "shows",
    "action": "Shows the current chord, playback source and progress, upcoming sections, and Style, Tempo, Transpose and Prog controls.",
    "short_label": "HOME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "1251-1288",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L1251-L1288"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3737-3750",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3737-L3750"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "shows",
    "action": "Shows the section list, insertion cursor, playing section and mutes, with Section, Prog, Groove and Repeat controls.",
    "short_label": "SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "1627-1645",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L1627-L1645"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "1803-1821",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L1803-L1821"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3849-3868",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3849-L3868"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "shows",
    "action": "Shows the song sections with the selected section transpose and the song Intro, Ending and At end controls.",
    "short_label": "SONG OPTIONS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "1627-1645",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L1627-L1645"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3871-3884",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3871-L3884"
     }
    ]
   },
   {
    "mode": "progression",
    "gesture": "shows",
    "action": "Shows the progression as chord cells with its cursor and playhead, plus Bar, Beat, Root and Type controls.",
    "short_label": "PROGRESSION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "1397-1420",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L1397-L1420"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3886-3896",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3886-L3896"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "shows",
    "action": "Shows the same progression with Length, Beats, Bass and Name controls.",
    "short_label": "PROG OPTIONS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "1397-1420",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L1397-L1420"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3898-3918",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3898-L3918"
     }
    ]
   },
   {
    "mode": "band",
    "gesture": "shows",
    "action": "Shows the groove notes by instrument, the cursor and playhead, and Grid, Bar, Beat and Muted controls; recording shows the selected track or melody in more detail.",
    "short_label": "BAND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "2012-2044",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L2012-L2044"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3759-3777",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3759-L3777"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "5127-5130",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L5127-L5130"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "shows",
    "action": "Shows the groove length and name with Bars, Beats, Place and Letter controls.",
    "short_label": "GROOVE SIZE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3127-3169",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3127-L3169"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3778-3785",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3778-L3785"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "shows",
    "action": "Shows the selected sound and its family, range and Type controls for an instrument, or melody notes with Sound, Channel and Velocity controls for a melody.",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3226-3244",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3226-L3244"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3786-3805",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3786-L3805"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "5135-5138",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L5135-L5138"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "shows",
    "action": "Shows the high-key boundary and MIDI channel for an instrument, with no high-key setting for drums.",
    "short_label": "SOUND 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3253-3285",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3253-L3285"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3806-3817",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3806-L3817"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "shows",
    "action": "Shows ten instrument and melody strips with their volume and pan, plus Volume, Pan, Reverb and Chorus for the selected strip.",
    "short_label": "MIXER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3326-3355",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3326-L3355"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3818-3829",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3818-L3829"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "shows",
    "action": "Shows brightness and resonance for ten strips with Bright and Reso controls for the selected strip.",
    "short_label": "MIXER TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3357-3392",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3357-L3392"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3830-3833",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3830-L3833"
     }
    ]
   },
   {
    "mode": "effects",
    "gesture": "shows",
    "action": "Shows every strip reverb and chorus send with controls for the two shared effects and their levels.",
    "short_label": "EFFECTS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3394-3430",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3394-L3430"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3834-3838",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3834-L3838"
     }
    ]
   },
   {
    "mode": "style",
    "gesture": "shows",
    "action": "Shows all six groove assignments, highlighting Intro, Groove A and Groove B for KNOB 1 to 3, with the whole Style on KNOB 4.",
    "short_label": "STYLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3432-3457",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3432-L3457"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3920-3937",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3920-L3937"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "shows",
    "action": "Shows all six groove assignments, highlighting the two fills and Ending for KNOB 1 to 3, with the whole Style on KNOB 4.",
    "short_label": "STYLE EXTRAS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3432-3457",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3432-L3457"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3920-3937",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3920-L3937"
     }
    ]
   },
   {
    "mode": "setup",
    "gesture": "shows",
    "action": "Shows clock, MIDI output, lighting and click settings, explains the last turned control, and reports the installed QY70 style bank.",
    "short_label": "SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3475-3528",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3475-L3528"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3939-3944",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3939-L3944"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "shows",
    "action": "Shows processor load, sounding voices, version and audio dropout count.",
    "short_label": "STATUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3530-3552",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3530-L3552"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "shows",
    "action": "Shows the selected instrument or melody notes and playback position, with Place, Pitch, Length and Velocity controls and the song timeline for a melody.",
    "short_label": "NOTES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3008-3048",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3008-L3048"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3948-3988",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3948-L3988"
     }
    ]
   },
   {
    "mode": "list",
    "gesture": "shows",
    "action": "Shows the current page family controls, editable names and available actions, with the selected row highlighted.",
    "short_label": "LIST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "4709-4752",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L4709-L4752"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "4913-4934",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L4913-L4934"
     }
    ]
   },
   {
    "mode": "memory",
    "gesture": "shows",
    "action": "Shows the sixteen memory places, their contents and a count of occupied places.",
    "short_label": "MEMORY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "661-668",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L661-L668"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "4716-4721",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L4716-L4721"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "4867-4879",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L4867-L4879"
     }
    ]
   },
   {
    "mode": "confirmation",
    "gesture": "shows",
    "action": "Shows the pending question above the page and SEL to accept or HOME to cancel.",
    "short_label": "QUESTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "642-649",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L642-L649"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "4251-4258",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L4251-L4258"
     }
    ]
   },
   {
    "mode": "help",
    "gesture": "shows",
    "action": "Shows a context-dependent help card for the held button until it is released or another input is used.",
    "short_label": "HELP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "4650-4682",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L4650-L4682"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4161-4164",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4161-L4164"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4174-4177",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4174-L4177"
     }
    ]
   },
   {
    "mode": "home_held",
    "gesture": "shows",
    "action": "Shows the five groove shortcuts and sixteen progressions, marking what is playing, queued or chosen for the next start.",
    "short_label": "SHORTCUTS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3555-3589",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3555-L3589"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "3595-3648",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L3595-L3648"
     }
    ]
   },
   {
    "mode": "update",
    "gesture": "shows",
    "action": "Shows the countdown while both OCT buttons remain held, then the bootloader update screen after five seconds.",
    "short_label": "UPDATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "330-347",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L330-L347"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "172-181",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L172-L181"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "shows",
    "action": "Shows the failed-start recovery page with silent audio, USB reinstallation available and PLAY to retry starting Polly.",
    "short_label": "SAFE MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "184-225",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L184-L225"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "action": "Shows the remaining count-in beats in place of the page title while counting in.",
    "short_label": "COUNT IN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "650-654",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L650-L654"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "action": "Temporarily replaces the title with the result of an action or a refusal, while the underlying page remains visible.",
    "short_label": "MESSAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "655-660",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L655-L660"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "action": "Shows the page name and tempo above the page, page dots and context below it, and control hints along the bottom.",
    "short_label": "PAGE GUIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "678-710",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L678-L710"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "4210-4243",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L4210-L4243"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "4496-4510",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L4496-L4510"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "action": "Shows Polly branding during startup and reports a previous crash if one was recorded.",
    "short_label": "STARTING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "238-250",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L238-L250"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "274-284",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L274-L284"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "shows",
    "short_label": "CALIBRATION",
    "action": "Prompts for fourteen button names and seven clockwise encoder turns, then stores the completed panel mapping or abandons it after thirty seconds without an answer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/panel.c",
      "lines": "46-108",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/panel.c#L46-L108"
     }
    ]
   },
   {
    "mode": "restore_confirm",
    "gesture": "shows",
    "short_label": "USB RESTORE",
    "action": "Shows the USB restore question after the file has been staged, asking physical SEL to replace the saved songs or HOME to cancel, with cancellation after sixty seconds.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/backup.c",
      "lines": "460-479",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/backup.c#L460-L479"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "RESTORING",
    "action": "Shows USB restore progress as a percentage while receiving the file, before the confirmation question.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "222-236",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L222-L236"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "QY70 WRITE",
    "action": "Shows QY70 style transfer progress while playback is stopped, then reloads the current grooves and clears undo after a begun transfer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "162-185",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L162-L185"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "380-393",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L380-L393"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2159-2175",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2159-L2175"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "shows",
    "short_label": "BASS RULE",
    "action": "Can ask PLAY THIS BASS AS WRITTEN? after entering or repitching a bass note that the chord rule would force to the root, with SEL changing Type to Chord 1 and HOME retaining the rule without another question for that groove until restart.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "163-188",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L163-L188"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "216-221",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L216-L221"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/editor.c",
      "lines": "245-255",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/editor.c#L245-L255"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "2688-2704",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L2688-L2704"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "169-180",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L169-L180"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "CHIP UPDATE",
    "action": "After four consecutive failed starts, recovery enters the chip’s update mode instead of attempting another ordinary Polly start.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "425-438",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L425-L438"
     }
    ]
   }
  ],
  "jack_midi_in": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Accepts notes and controllers on all sixteen channels alongside the arranger without Transpose, and accepts clock, start, continue and stop when Clock is MIDI.",
    "short_label": "MIDI INPUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "45-49",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L45-L49"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "115-120",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L115-L120"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4092-4123",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4092-L4123"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "CHANNEL DATA",
    "action": "Incoming CC 7, 10, 91 and 93 change channel volume, pan, reverb and chorus in RAM, and program changes update its sound except on channel 10; these messages do not mark settings for saving and reach flash only when another action marks settings changed and a save writes them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4092-4124",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4092-L4124"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "106-111",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L106-L111"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "669-680",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L669-L680"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2050",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2050"
     }
    ]
   }
  ],
  "jack_usb_c": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Connects Polly FM-1 for MIDI input and optional track and clock output, stereo audio recording, and the computer QY70 style installation, update, backup, restore, mirroring and screen-reader tools.",
    "short_label": "USB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/usb.c",
      "lines": "234",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/usb.c#L234"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "31-40",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L31-L40"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4092-4123",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4092-L4123"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "349-378",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L349-L378"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "35-48",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L35-L48"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "92-98",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L92-L98"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/bank_rx.c",
      "lines": "76-123",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/bank_rx.c#L76-L123"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/bank_rx.c",
      "lines": "145-165",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/bank_rx.c#L145-L165"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "380-393",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L380-L393"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "178-185",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L178-L185"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2159-2175",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2159-L2175"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "635-645",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L635-L645"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "368-395",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L368-L395"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "tools/qy70_install.py",
      "lines": "92-106",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/tools/qy70_install.py#L92-L106"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "QY70 INSTALL",
    "action": "Save first because a QY70 style transfer stops playback and erases the entire bank area, including unused space, without an on-unit question or undo, can lose the old bank if writing fails, and reloads the current grooves after a begun transfer even on failure, discarding their unsaved edits and clearing undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/bank_rx.c",
      "lines": "76-123",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/bank_rx.c#L76-L123"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/bank_rx.c",
      "lines": "145-165",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/bank_rx.c#L145-L165"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "380-393",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L380-L393"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "178-185",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L178-L185"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "2159-2175",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2159-L2175"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "635-645",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L635-L645"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "368-395",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L368-L395"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "tools/qy70_install.py",
      "lines": "92-106",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/tools/qy70_install.py#L92-L106"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "USB UPDATE",
    "action": "Save and back up before starting an update from the computer because its restart does not save pending edits and the unit does not ask to save them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "394-400",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L394-L400"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/ota.c",
      "lines": "341-381",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/ota.c#L341-L381"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "129-136",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L129-L136"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "REMOTE PANEL",
    "action": "With Control enabled on Polly’s browser Mirror page, held mouse buttons operate panel keys and buttons and scrolling operates encoders, while USB restore approval still requires physical SEL or HOME.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "web/mirror/index.html",
      "lines": "500-535",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/web/mirror/index.html#L500-L535"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/mirror.c",
      "lines": "405-444",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/mirror.c#L405-L444"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/main.c",
      "lines": "239-254",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L254"
     }
    ]
   }
  ],
  "switch_power": [
   {
    "mode": "any",
    "gesture": "power_on_holding:button_oct_down+button_oct_up",
    "short_label": "CALIBRATE",
    "action": "Starts panel calibration, which asks for each button and clockwise encoder turn, writes the completed mapping at once without a final question or undo, and keeps the previous mapping if any prompt times out after thirty seconds.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "307-309",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L307-L309"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/panel.c",
      "lines": "46-108",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/panel.c#L46-L108"
     }
    ]
   }
  ]
 },
 "lights": {
  "button_home": [
   {
    "mode": "home",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glows faintly when not otherwise lit and Lights is on; notes or off removes this background glow.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4256-4259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4256-L4259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "48-80",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L48-L80"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "progression",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "progression_settings",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glows faintly when not otherwise lit and Lights is on; notes or off removes this background glow.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4256-4259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4256-L4259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "48-80",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L48-L80"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "band",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "groove_length",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glows faintly when not otherwise lit and Lights is on; notes or off removes this background glow.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4256-4259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4256-L4259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "48-80",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L48-L80"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "sound",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "sound_settings",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glows faintly when not otherwise lit and Lights is on; notes or off removes this background glow.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4256-4259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4256-L4259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "48-80",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L48-L80"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "mixer",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "mixer_tone",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glows faintly when not otherwise lit and Lights is on; notes or off removes this background glow.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4256-4259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4256-L4259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "48-80",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L48-L80"
     }
    ]
   }
  ],
  "button_fx": [
   {
    "mode": "effects",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glows faintly when not otherwise lit and Lights is on; notes or off removes this background glow.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4256-4259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4256-L4259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "48-80",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L48-L80"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "style",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "style_more",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glows faintly when not otherwise lit and Lights is on; notes or off removes this background glow.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4256-4259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4256-L4259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "48-80",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L48-L80"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "setup",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "status",
    "gesture": "lit",
    "action": "Marks the page family currently on screen.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4233-4237",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4233-L4237"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "50-52",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L50-L52"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glows faintly when not otherwise lit and Lights is on; notes or off removes this background glow.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4256-4259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4256-L4259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "48-80",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L48-L80"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glows faintly when not otherwise lit and Lights is on; notes or off removes this background glow.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4256-4259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4256-L4259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "48-80",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L48-L80"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glows faintly when not otherwise lit and Lights is on; notes or off removes this background glow.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4256-4259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4256-L4259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "48-80",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L48-L80"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Lights for tracked unsaved work, but can remain dark when full memory leaves a style-groove take or oversized progression unkept, while discarded melody notes never become saved work.",
    "short_label": "UNSAVED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4231-4232",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4231-L4232"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/pages.c",
      "lines": "322-331",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L322-L331"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "419-445",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L419-L445"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "486-508",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L486-L508"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "544-578",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L544-L578"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glows faintly when not otherwise lit and Lights is on; notes or off removes this background glow.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4256-4259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4256-L4259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "48-80",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L48-L80"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Lights green while playback runs without recording.",
    "short_label": "PLAYING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4222-4228",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4222-L4228"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "54-74",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L54-L74"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Lights red during playback while any recording mode is active.",
    "short_label": "RECORDING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4222-4230",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4222-L4230"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4258-4259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4258-L4259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "54-74",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L54-L74"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "blinking",
    "action": "Blinks red twice per second when stopped with recording armed.",
    "short_label": "ARMED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4215-4228",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4215-L4228"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4258-4259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4258-L4259"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glows faintly when not otherwise lit and Lights is on; notes or off removes this background glow.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4256-4259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4256-L4259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "48-80",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L48-L80"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Lights while track recording is enabled, a chord take is armed or running, or section recording is armed.",
    "short_label": "RECORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4222-4230",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4222-L4230"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/dsp/arr.c",
      "lines": "2267-2272",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/dsp/arr.c#L2267-L2272"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glows faintly when not otherwise lit and Lights is on; notes or off removes this background glow.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4256-4259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4256-L4259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "48-80",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L48-L80"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Glows faintly when not otherwise lit and Lights is on; notes or off removes this background glow.",
    "short_label": "GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4256-4259",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4256-L4259"
     },
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "48-80",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/plat_fm1.c#L48-L80"
     }
    ]
   }
  ],
  "key_lights": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Lights each held key when Lights is on or notes, except while HOME is held.",
    "short_label": "HELD KEYS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4238-4248",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4238-L4248"
     }
    ]
   },
   {
    "mode": "home_held",
    "gesture": "lit",
    "action": "Lights the black shortcut key for the next groove if queued or the current groove otherwise, and the white shortcut key for the current progression, even with Lights off.",
    "short_label": "SHORTCUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4238-4244",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4238-L4244"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "dim",
    "action": "Dimly marks the muted tracks at the cursor, or the final section while the cursor is on END, even with Lights off; a held key takes precedence.",
    "short_label": "MUTED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4245-4257",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4245-L4257"
     }
    ]
   },
   {
    "mode": "song_settings",
    "gesture": "dim",
    "action": "Dimly marks the muted tracks at the cursor, or the final section while the cursor is on END, even with Lights off; a held key takes precedence.",
    "short_label": "MUTED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "charlesvestal/fm1-polly",
      "ref": "v0.4.3",
      "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
      "path": "firmware/src/app/ui.c",
      "lines": "4245-4257",
      "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4245-L4257"
     }
    ]
   }
  ]
 },
 "switching_note": {
  "kept_on_unit": "Polly keeps four songs with their progressions, sixteen memory places shared by edited grooves, melodies and larger progressions, and its settings; calibration and QY70 styles are separate. A Polly update retains saved songs and grooves but does not first save pending edits. SAVE attempts an immediate write without asking, and automatic saving waits for stopped playback, released keys and buttons, faded voices and four seconds without input. If sections sharing an edited groove differ, saving keeps the newest changed version and replaces the others. Full memory can leave a groove take or oversized progression unkept even when SAVE is dark, while melody notes needing more space are discarded. Free enough places before leaving or switching off, and record discarded melody notes again. Changing songs saves savable pending work first and clears undo. From the flash atlas: install (Polly update loader): Checks package CRC and chip key before erasing; writes only unequal program sectors and verifies them. Does not program the boot head or initialize user objects (a recognized valid Polly package). install (Polly update loader cleanup): Erases sectors in these windows only if their tails contain a valid update record: AT marker, nonzero CRC16 and matching CRC of record bytes 2..79. Does not scan other data sectors. QY70 bank guards prevent its E8000 sector from resembling such a record (a validated update record is present). every start-up before safe mode: Resumes a valid interrupted confirmed restore by completing eighteen staged headers and removing its journal. Invalid nonblank journal records are erased. Current project/song/slot data are otherwise only read at this stage (only if a pending restore journal is valid; invalid nonblank journal sector may instead be erased). every start-up before safe mode: After restore recovery, checks four bytes at the staged loader start and eight bytes at the OTA record. If any checked byte is not FF, erases all five staging sectors. Other occupied staging bytes alone do not trigger this cleanup (at least one probed byte at E0000 or E4F00 is nonblank). normal start-up: Loads project, calibration and songs without initializing their flash records. Immediately frees recognized Polly overflow-progression slots whose songs no longer reference them. Melody validation can mark recognized Polly melody parts dirty for later save/autosave. Ordinary foreign records do not satisfy these Polly payload checks. The tidy runs even when project_songs_load fails: default songs remove every external-progression reference, so all recognized nonempty overflow-progression slots are freed immediately (only orphaned recognized Polly progression slots; later repair save only for recognized Polly melody parts; failed/damaged/overwritten song records also trigger this for all recognized nonempty overflow-progression slots). update started while Polly is running: Erases staging, writes and verifies the incoming package loader, commits its head, then requires host success before writing the OTA record at E4F00 and restarting. A recognized official loader also requires all boot-head bytes to match. Failure or dry-run erases staging again. This path does not flush pending project/song/groove edits before restarting; save first (installer starts an accepted update; official-loader whole-image behavior is described in comments, not proven by proprietary source). What Polly writes over the previous firmware's data is in overwrites_previous; what the next firmware writes over Polly's is in when_you_leave.",
  "lost": "Back up before switching; see the switching advice in this section. Another firmware can overwrite Polly data during startup or ordinary use without a save action. From the flash atlas: Other firmwares reading Polly's data: FoMni reads and uses Polly's Polly button and encoder calibration; AMB-1 reads and uses Polly's Polly button and encoder calibration. What Polly reads of other firmwares' data: Polly reads and uses FoMni's FoMni button calibration; Polly reads and uses AMB-1's AMB-1 panel calibration. Everything else of another firmware's looks empty or foreign to the reader.",
  "back_up_first": "Stop playback, release the keys, press SAVE and check that it succeeds, then connect USB and use Back up at https://charlesvestal.github.io/fm1-polly/backup/ to download a .plb file. This reads the unit directly; it does not maintain a browser song bank. A backup contains settings, four songs and all sixteen memory places, but excludes button calibration and QY70 styles; keep your QY70 ROM to install those again. A backup taken during playback includes only the previously saved work. Restore checks the file, then asks on the unit; SEL accepts and HOME declines, with a one-minute timeout. Confirmed restoration replaces settings, songs and memory, including clearing places absent from the file, keeps calibration and QY70 styles, and clears undo history; undo cannot reverse it. The browser also asks before sending a restore. Inactive flash copies can be written before the on-unit question, even if you decline. Save and make a backup before any computer-started firmware update as well as before using the OCT-button update gesture; neither route saves pending edits. Save before installing QY70 styles too, because the transfer reloads grooves and clears undo even when a begun write fails.",
  "source": [
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "669-750",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L669-L750"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "2070-2092",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2070-L2092"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "4262-4276",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4262-L4276"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/project.c",
    "lines": "52-79",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/project.c#L52-L79"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/project.c",
    "lines": "242-254",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/project.c#L242-L254"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/backup.c",
    "lines": "59-67",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/backup.c#L59-L67"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/backup.c",
    "lines": "389-479",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/backup.c#L389-L479"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "2176-2185",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2176-L2185"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "web/backup/index.html",
    "lines": "378-402",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/web/backup/index.html#L378-L402"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "web/backup/index.html",
    "lines": "426-446",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/web/backup/index.html#L426-L446"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/main.c",
    "lines": "239-259",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L239-L259"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/backup.c",
    "lines": "2-35",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/backup.c#L2-L35"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/backup.c",
    "lines": "193-203",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/backup.c#L193-L203"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "697-738",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L697-L738"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "419-445",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L419-L445"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "486-508",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L486-L508"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "544-578",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L544-L578"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "3264-3283",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3264-L3283"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/pages.c",
    "lines": "322-331",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L322-L331"
   },
   {
    "kind": "doc",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "MANUAL.md",
    "lines": "1380-1381",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/MANUAL.md#L1380-L1381"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/loader/ldr_window.h",
    "lines": "23-24",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/loader/ldr_window.h#L23-L24"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/main_fm1.c",
    "lines": "394-400",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L394-L400"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/ota.c",
    "lines": "341-381",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/ota.c#L341-L381"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/main.c",
    "lines": "129-136",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L129-L136"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/bank_rx.c",
    "lines": "76-123",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/bank_rx.c#L76-L123"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/bank_rx.c",
    "lines": "145-165",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/bank_rx.c#L145-L165"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/main_fm1.c",
    "lines": "380-393",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/main_fm1.c#L380-L393"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/main.c",
    "lines": "178-185",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/main.c#L178-L185"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "2159-2175",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L2159-L2175"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "635-645",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L635-L645"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "368-395",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L368-L395"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "tools/qy70_install.py",
    "lines": "92-106",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/tools/qy70_install.py#L92-L106"
   }
  ],
  "overwrites_previous": [
   {
    "from": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "stock settings (and possibly patterns)",
     "stock Bluetooth data",
     "stock voices (128 user patches, banks A-D)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): stock settings (and possibly patterns); stock Bluetooth data; stock voices (128 user patches, banks A-D).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "baudgirl",
    "name": "Baud Girl FM-1+VA",
    "flags": "?",
    "weakest_grade": "inferred",
    "at_risk": [],
    "possibly_at_risk": [
     "Baud Girl presets (128)",
     "Baud Girl patterns (16, with locks)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): Baud Girl presets (128); Baud Girl patterns (16, with locks).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "felucca",
    "name": "Felucca",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "project slot A",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot B",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot C",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot D",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patches of the FM6 user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you complete power-on hardware calibration (no question) [through its preset bank]",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question) [through its preset bank]",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, button calibration, favourites, MIDI LEARN map",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user presets 1-16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete power-on hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user presets 17-32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the autosave (the music as you left it)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 voice bank B1-B32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: project slot A; project slot B; project slot C; project slot D; FM6 patches of the FM6 user presets; user sample slot USR1; user sample slot USR2; settings, button calibration, favourites, MIDI LEARN map. At risk when you act: user sample slot USR3; user presets 1-16; user presets 17-32; the autosave (the music as you left it); FM6 voice bank B1-B32.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloop",
    "name": "SLOOP",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "song section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the music in progress (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1 (header at 0xA0000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2 (header at 0xB4000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR4 (header at 0xE7000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a sector tail contains a valid update record",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3 (header at 0xC8000)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete power-on hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patch bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project); the music in progress (autosave); user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000); settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk by itself, under a condition: user sample slot USR4 (header at 0xE7000). At risk when you act: user sample slot USR3 (header at 0xC8000); user sounds U01-U16; user sounds U17-U32; FM6 patch bank B1-B27.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "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 choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "break loops slot 1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "break loops slot 2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "break loops slot 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "X0X button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete power-on 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); break loops slot 1; break loops slot 2. At risk when you act: break loops slot 3; 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": "song 1 section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patches of the FM6 user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you complete power-on hardware calibration (no question) [through its preset bank]",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question) [through its preset bank]",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 2: four sections (whole projects)",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "some of it lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "song 3: four sections (whole projects)",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "some of it lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "song 4: four sections (whole projects)",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "some of it lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "song 5: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "some of it lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "settings, calibration, favourites, MENU options",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 6: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 7: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 8: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "which song is current, every song's rows and scenes",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete power-on hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the music in progress (RESTORE LAST)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 voice bank B1-B32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: song 1 section A (a whole project); song 1 section B (a whole project); song 1 section C (a whole project); song 1 section D (a whole project); FM6 patches of the FM6 user sounds; song 2: four sections (whole projects) (some of it lost); song 3: four sections (whole projects) (some of it lost); song 4: four sections (whole projects) (some of it lost); song 5: four sections (whole projects); settings, calibration, favourites, MENU options. At risk when you act: song 6: four sections (whole projects); song 7: four sections (whole projects); song 8: four sections (whole projects); which song is current, every song's rows and scenes; user sounds U01-U16; user sounds U17-U32; the music in progress (RESTORE LAST); FM6 voice bank B1-B32.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "melodee",
    "name": "Melodee",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared user presets U289-U378",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "some of it lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "shared user presets U379-U384",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U109-U126",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U055-U072",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a sector tail contains a valid update record",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U145-U288",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U073-U090",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U091-U108",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete power-on hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U019-U036",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U037-U054",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U127-U144",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: shared user presets U289-U378 (some of it lost); shared user presets U379-U384; shared user presets U109-U126; project A: patterns, song, sounds, motion, recordings; project B: patterns, song, sounds, motion, recordings; project C: patterns, song, sounds, motion, recordings; settings, factory favourites, calibration, saved template. At risk by itself, under a condition: shared user presets U055-U072. At risk when you act: project D: patterns, song, sounds, motion, recordings; shared user presets U145-U288; shared user presets U073-U090; shared user presets U091-U108; shared user presets U001-U018; shared user presets U019-U036; shared user presets U037-U054; shared user presets U127-U144.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fomni",
    "name": "FoMni",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FoMni setup (pages, chord buttons, lights)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you 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)"
   },
   {
    "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 confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "AMB-1 panel calibration"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: AMB-1 pieces and setup. Carried over: AMB-1 panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "choralroot",
    "name": "ChoralRoot",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "32 imported DX7 voices",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank A (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank B (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank C (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank D (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank E (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank F (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank G (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank H (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last global-save session",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "favourite marks, chord/bass type and filter",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "128 saved sounds with their complete engine patches",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "some or all of it lost"
       }
      ]
     },
     {
      "object": "options, playing setup and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: 32 imported DX7 voices; CZ-1 bank A (16 tones); CZ-1 bank B (16 tones); CZ-1 bank C (16 tones); CZ-1 bank D (16 tones); CZ-1 bank E (16 tones); CZ-1 bank F (16 tones); CZ-1 bank G (16 tones); CZ-1 bank H (16 tones); last global-save session; favourite marks, chord/bass type and filter; 128 saved sounds with their complete engine patches; options, playing setup and panel calibration. At risk when you act: recorded loop 1; recorded loop 2; recorded loop 3; recorded loop 4; recorded loop 5; recorded loop 6; recorded loop 7; recorded loop 8; recorded loop 9; recorded loop 10.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "ghoulbox",
    "name": "GHOULBOX",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patches for user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you complete power-on hardware calibration (no question) [through its preset bank]",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question) [through its preset bank]",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete power-on hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "music in progress (RESTORE LAST)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 voice bank B1–B32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: project A; project B; project C; project D; FM6 patches for user sounds; user sample slot USR1; user sample slot USR2; settings and panel calibration. At risk when you act: user sample slot USR3; user sounds 1–16; user sounds 17–32; music in progress (RESTORE LAST); FM6 voice bank B1–B32.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Open shared sample audio",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if a sector tail contains a valid update record",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if the checked loader or update-record bytes are not blank",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if the restore-journal sector begins with a nonblank invalid record",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you complete power-on hardware calibration (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm RESTORE FROM USB (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you start a firmware update while Polly is running (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Open USER project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open device preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Polly (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Open shared sample audio. At risk when you act: Open USER project 1; Open USER project 2; Open USER project 3; Open USER project 4; Open USER project 5; Open USER project 6; Open USER project 7; Open USER project 8; Open USER project 9; Open USER project 10; Open USER project 11; Open USER project 12; Open USER project 13; Open USER project 14; Open USER project 15; Open USER project 16; Open device preferences.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm106",
    "name": "FM-106",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "older stored user bank, if present (Beta4 does not store new edits)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "octave, last selected preset and MIDI preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls."
    ],
    "owner_text": "At risk by itself: older stored user bank, if present (Beta4 does not store new edits); octave, last selected preset and MIDI preferences. A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "hortator",
    "name": "Hortator",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: project A; project B; project C; project D; user samples USR1; user samples USR2; settings and panel calibration. At risk when you act: user samples USR3.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "obervave",
    "name": "OberVave",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "pattern 1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "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"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (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"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "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"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (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"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "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"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (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"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 4",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "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"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (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"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 5",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "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"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (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"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 6",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "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"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (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"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 7",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "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"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (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"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 8",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "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"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (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"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: pattern 1 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 2 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 3 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 4 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 5 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 6 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 7 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 8 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); saved programs and global settings.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "skiff",
    "name": "Skiff",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a sector tail contains a valid update record [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question) [through its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a sector tail contains a valid update record [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question) [through its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a sector tail contains a valid update record [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question) [through its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a sector tail contains a valid update record [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question) [through its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds’ own FM6 patches",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sound bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you complete power-on hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you press SAVE (no question) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sound bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question) [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "settings, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last session",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a sector tail contains a valid update record [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared 64-pattern pool",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a sector tail contains a valid update record",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: project A; project B; project C; project D; user sounds’ own FM6 patches; user sample USR1; user sample USR2; user sound bank 1 (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sound bank 2 (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); settings, calibration and favourites. At risk by itself, under a condition: last session; shared 64-pattern pool. At risk when you act: user sample USR3.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ],
  "when_you_leave": [
   {
    "to": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "Optional QY70 style bank",
     "All four Polly songs",
     "Polly shared memory 1",
     "Polly shared memory 2",
     "Polly shared memory 3",
     "Polly shared memory 4",
     "Polly shared memory 5",
     "Polly shared memory 6",
     "Polly shared memory 7",
     "Polly shared memory 8",
     "Polly shared memory 9",
     "Polly shared memory 10",
     "Polly shared memory 11",
     "Polly shared memory 12",
     "Polly shared memory 13",
     "Polly shared memory 14",
     "Polly shared memory 15",
     "Polly shared memory 16",
     "Polly button and encoder calibration"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): Optional QY70 style bank; All four Polly songs; Polly shared memory 1; Polly shared memory 2; Polly shared memory 3; Polly shared memory 4; Polly shared memory 5; Polly shared memory 6; Polly shared memory 7; Polly shared memory 8; Polly shared memory 9; Polly shared memory 10; Polly shared memory 11; Polly shared memory 12; Polly shared memory 13; Polly shared memory 14; Polly shared memory 15; Polly shared memory 16; Polly button and encoder 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": [
     "Optional QY70 style bank",
     "All four Polly songs",
     "Polly shared memory 1",
     "Polly shared memory 2",
     "Polly shared memory 3",
     "Polly shared memory 4",
     "Polly shared memory 5",
     "Polly shared memory 6",
     "Polly shared memory 7",
     "Polly shared memory 8",
     "Polly shared memory 9",
     "Polly shared memory 10",
     "Polly shared memory 11",
     "Polly shared memory 12",
     "Polly shared memory 13",
     "Polly shared memory 14",
     "Polly shared memory 15",
     "Polly shared memory 16",
     "Polly button and encoder calibration"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): Optional QY70 style bank; All four Polly songs; Polly shared memory 1; Polly shared memory 2; Polly shared memory 3; Polly shared memory 4; Polly shared memory 5; Polly shared memory 6; Polly shared memory 7; Polly shared memory 8; Polly shared memory 9; Polly shared memory 10; Polly shared memory 11; Polly shared memory 12; Polly shared memory 13; Polly shared memory 14; Polly shared memory 15; Polly shared memory 16; Polly button and encoder 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": "Optional QY70 style bank",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it (its RESTORE LAST is on by default)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if an earlier Felucca or GHOULBOX voice-bank upload survives and the saved bank is missing or older",
        "effect": "damaged (part of it written over)"
       },
       {
        "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 an FM6 voice bank from the web editor",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you send data from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Polly setup and channel sounds",
      "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": "All four Polly songs",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 4",
      "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"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly button and encoder 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": [
     "With no readable older Felucca-family settings copy left, these records supply no Felucca preferences. RESTORE LAST starts ON and autosave writes by itself after edits and quiet."
    ],
    "owner_text": "At risk by itself: Optional QY70 style bank; Polly setup and channel sounds. At risk when you act: All four Polly songs; Polly shared memory 1; Polly shared memory 2; Polly shared memory 3; Polly shared memory 4; Polly shared memory 5; Polly shared memory 6; Polly shared memory 7; Polly shared memory 8; Polly shared memory 9; Polly shared memory 10; Polly shared memory 11; Polly shared memory 12; Polly shared memory 13; Polly shared memory 14; Polly shared memory 15; Polly shared memory 16; Polly button and encoder calibration. With no readable older Felucca-family settings copy left, these records supply no Felucca preferences. RESTORE LAST starts ON and autosave writes by itself after edits and quiet.",
    "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": "Polly shared memory 4",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start an update (no question)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly setup and channel sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "All four Polly songs",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Optional QY70 style bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Polly button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Polly shared memory 4; Polly setup and channel sounds. At risk when you act: All four Polly songs; Polly shared memory 1; Polly shared memory 2; Polly shared memory 3; Polly shared memory 5; Polly shared memory 6; Polly shared memory 7; Polly shared memory 8; Polly shared memory 9; Polly shared memory 10; Polly shared memory 11; Polly shared memory 12; Polly shared memory 13; Polly shared memory 14; Polly shared memory 15; Polly shared memory 16; Optional QY70 style bank; Polly button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "x0x",
    "name": "X0X",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "All four Polly songs",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Optional QY70 style bank",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Polly setup and channel sounds",
      "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": "Polly shared memory 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly button and encoder 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: All four Polly songs; Polly shared memory 1; Polly shared memory 2; Polly shared memory 3; Optional QY70 style bank; Polly setup and channel sounds. At risk when you act: Polly shared memory 4; Polly shared memory 5; Polly shared memory 6; Polly shared memory 7; Polly shared memory 8; Polly shared memory 9; Polly shared memory 10; Polly shared memory 11; Polly shared memory 12; Polly shared memory 13; Polly shared memory 14; Polly shared memory 15; Polly shared memory 16; Polly button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "jiant",
    "name": "JIANT",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Optional QY70 style bank",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if it ran on this unit before and its staged voice bank survived",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if its RESTORE LAST is on",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you select a song through MIDI PROGRAM CHANGE (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you send an FM6 voice bank from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you switch song or project (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Polly setup and channel sounds",
      "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": "All four Polly songs",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you 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"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (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": [
     "With no readable older JIANT/Felucca-family settings copy left, this firmware supplies no JIANT RESTORE LAST preference. JIANT starts with RESTORE LAST OFF; autosave writes only after you enable it."
    ],
    "owner_text": "At risk by itself: Optional QY70 style bank; Polly setup and channel sounds. At risk when you act: All four Polly songs; Polly shared memory 1; Polly shared memory 2; Polly shared memory 3; Polly shared memory 4; Polly shared memory 5; Polly shared memory 6; Polly shared memory 7; Polly shared memory 8; Polly shared memory 9; Polly shared memory 10; Polly shared memory 11; Polly shared memory 12; Polly shared memory 13; Polly shared memory 14; Polly shared memory 15; Polly shared memory 16; Polly button and encoder calibration. With no readable older JIANT/Felucca-family settings copy left, this firmware supplies no JIANT RESTORE LAST preference. JIANT starts with RESTORE LAST OFF; autosave writes only after you enable it.",
    "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": "Polly setup and channel sounds",
      "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": "Optional QY70 style bank",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "All four Polly songs",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore an older 28-object Melodee backup (clears U379-U384 first) (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 4",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "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 project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly button and encoder 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"
       }
      ]
     },
     {
      "object": "Polly shared memory 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Polly setup and channel sounds. At risk by itself, under a condition: Optional QY70 style bank; All four Polly songs; Polly shared memory 1; Polly shared memory 2; Polly shared memory 3; Polly shared memory 4; Polly button and encoder calibration. At risk when you act: Polly shared memory 5; Polly shared memory 6; Polly shared memory 7; Polly shared memory 8; Polly shared memory 9; Polly shared memory 10; Polly shared memory 11; Polly shared memory 12; Polly shared memory 13; Polly shared memory 14; Polly shared memory 15; Polly shared memory 16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fomni",
    "name": "FoMni",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "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)"
   },
   {
    "to": "amb",
    "name": "AMB-1",
    "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)"
   },
   {
    "to": "choralroot",
    "name": "ChoralRoot",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Polly shared memory 14",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a save or failed boot preparation leaves its next spare unprepared",
        "effect": "lost"
       },
       {
        "way": "by itself, only if an older ChoralRoot session save survives and its next spare is not blank",
        "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 SAVE for a global save (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore settings, which also writes an empty session record from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 15",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a save or failed boot preparation leaves its next spare unprepared",
        "effect": "lost"
       },
       {
        "way": "by itself, only if an older ChoralRoot favourites save survives and its next spare is not blank",
        "effect": "lost"
       },
       {
        "way": "by itself, only if an older ChoralRoot session save survives and its next spare is not blank",
        "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 switching 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 favourites from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore settings, which also writes an empty session record from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 16",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a save or failed boot preparation leaves its next spare unprepared",
        "effect": "lost"
       },
       {
        "way": "by itself, only if an older ChoralRoot favourites save survives and its next spare is not blank",
        "effect": "lost"
       },
       {
        "way": "by itself, only if an older ChoralRoot sound-pool save survives and its next spare is not blank",
        "effect": "lost"
       },
       {
        "way": "when you choose Overwrite or Save as new and accept with OCT+ or SAVE (no question; it rewrites the whole bank)",
        "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 deletion/reset with OCT+ (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you hold OCT- and OCT+ while switching 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 request Import 0.21 sounds from the device manager (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore favourites from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore pool banks 50..62, or accepted legacy sound objects that are redirected into pool slots 1..32 from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Optional QY70 style bank",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if a save or failed boot preparation leaves its next spare unprepared",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if an older ChoralRoot sound-pool save survives and its next spare is not blank",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if no pool bank exists and at least one legacy UPB1/192 sound passes validation",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you choose Overwrite or Save as new and accept with OCT+ or SAVE (no question; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm deletion/reset with OCT+ (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you hold SAVE after recording/editing/clearing this loop (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you press REC in Advance mode with a nonempty current loop (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request Import 0.21 sounds from the device manager (no question; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 40; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 41; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 42; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 43; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 44; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 45; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 46; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 47; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 48; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 49; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore pool banks 50..62, or accepted legacy sound objects that are redirected into pool slots 1..32 from backup software (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Polly setup and channel sounds",
      "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": "All four Polly songs",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore FM6 bank id 8 from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a DX7 bank dump (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank A (id 14) from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank A (id 14) from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank B (id 15) from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank B (id 15) from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank C (id 16) from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank C (id 16) from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank D (id 17) from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank D (id 17) from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank E (id 18) from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank E (id 18) from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank F (id 19) from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank F (id 19) from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank G (id 20) from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank G (id 20) from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank H (id 21) from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank H (id 21) from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly button and encoder 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: Polly shared memory 14; Polly shared memory 15; Polly shared memory 16; Optional QY70 style bank; Polly setup and channel sounds. At risk when you act: All four Polly songs; Polly shared memory 1; Polly shared memory 2; Polly shared memory 3; Polly shared memory 4; Polly shared memory 5; Polly shared memory 6; Polly shared memory 7; Polly shared memory 8; Polly shared memory 9; Polly shared memory 10; Polly shared memory 11; Polly shared memory 12; Polly shared memory 13; Polly button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "ghoulbox",
    "name": "GHOULBOX",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Optional QY70 style bank",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it (its RESTORE LAST is on by default)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if a compatible staged bank survives and is newer than home, or home is invalid",
        "effect": "damaged (part of it written over)"
       },
       {
        "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 an FM6 voice bank",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Polly setup and channel sounds",
      "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": "Polly shared memory 4",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if no valid UPF6 exists and a valid old type-7 FM6B bank survives",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user patch",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "All four Polly songs",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly button and encoder 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": [
     "With no readable older Felucca-family settings copy left, GHOULBOX starts with RESTORE LAST ON and autosaves by itself after edits and quiet."
    ],
    "owner_text": "At risk by itself: Optional QY70 style bank; Polly setup and channel sounds. At risk by itself, under a condition: Polly shared memory 4. At risk when you act: All four Polly songs; Polly shared memory 1; Polly shared memory 2; Polly shared memory 3; Polly shared memory 5; Polly shared memory 6; Polly shared memory 7; Polly shared memory 8; Polly shared memory 9; Polly shared memory 10; Polly shared memory 11; Polly shared memory 12; Polly shared memory 13; Polly shared memory 14; Polly shared memory 15; Polly shared memory 16; Polly button and encoder calibration. With no readable older Felucca-family settings copy left, GHOULBOX starts with RESTORE LAST ON and autosaves by itself after edits and quiet.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Optional QY70 style bank",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "damaged (part of it written over)"
       },
       {
        "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": "All four Polly songs",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 4",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 5",
      "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": "Polly shared memory 6",
      "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": "Polly shared memory 7",
      "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": "Polly shared memory 8",
      "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": "Polly shared memory 9",
      "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": "Polly shared memory 10",
      "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": "Polly shared memory 11",
      "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": "Polly shared memory 12",
      "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": "Polly shared memory 13",
      "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": "Polly shared memory 14",
      "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": "Polly shared memory 15",
      "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": "Polly shared memory 16",
      "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": "Polly button and encoder 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": "Polly setup and channel sounds",
      "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 by itself: Optional QY70 style bank; All four Polly songs; Polly shared memory 1; Polly shared memory 2; Polly shared memory 3; Polly shared memory 4. At risk when you act: Polly shared memory 5; Polly shared memory 6; Polly shared memory 7; Polly shared memory 8; Polly shared memory 9; Polly shared memory 10; Polly shared memory 11; Polly shared memory 12; Polly shared memory 13; Polly shared memory 14; Polly shared memory 15; Polly shared memory 16; Polly button and encoder calibration; Polly setup and channel sounds.",
    "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": "Polly setup and channel sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm deletion of the active user slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE in the save screen (no question)",
        "effect": "lost"
       },
       {
        "way": "when you release a short SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Polly setup and channel sounds.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "hortator",
    "name": "Hortator",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Polly setup and channel sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (no question)",
        "effect": "lost"
       },
       {
        "way": "when you remember or forget a Bluetooth device (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "All four Polly songs",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Polly setup and channel sounds. At risk when you act: All four Polly songs; Polly shared memory 1; Polly shared memory 2; Polly shared memory 3.",
    "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": "Optional QY70 style bank",
      "effect": "damaged (part of it written over)",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 1 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 2 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 3 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 4 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 5 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 6 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 7 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 8 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you tap SAVE in the sequencer (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Polly setup and channel sounds",
      "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: Optional QY70 style bank (damaged (part of it written over)); Polly setup and channel sounds.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "skiff",
    "name": "Skiff",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Optional QY70 style bank",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself as you use it (its RESTORE LAST is on by default)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if a readable old autosave needs migration and its patterns fit",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if a readable old project needs pattern migration",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm clearing a pattern or song entry (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm erasing a sample slot (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you copy or change an entry’s pattern (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "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"
       }
      ]
     },
     {
      "object": "Polly setup and channel sounds",
      "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": "All four Polly songs",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a readable old Felucca/Skiff project needs migration, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you SAVE AS from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project through the browser’s legacy command (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a readable old Felucca/Skiff project needs migration, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you SAVE AS from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project through the browser’s legacy command (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a readable old Felucca/Skiff project needs migration, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you SAVE AS from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project through the browser’s legacy command (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a readable old Felucca/Skiff project needs migration, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you SAVE AS from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project through the browser’s legacy command (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 4",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a valid retired FM6 patch bank remains and no current patch object loads",
        "effect": "lost"
       },
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (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"
       },
       {
        "way": "when you save an FM6 user sound (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store an FM6 sound from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write an FM6 patch to a user sound from the editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (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": "Polly shared memory 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (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": "Polly shared memory 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (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": "Polly shared memory 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (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": "Polly shared memory 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (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": "Polly shared memory 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (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": "Polly shared memory 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (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": "Polly shared memory 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (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": "Polly shared memory 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (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": "Polly shared memory 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (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": "Polly shared memory 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (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": "Polly shared memory 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (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": "Polly button and encoder 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: Optional QY70 style bank; Polly setup and channel sounds. At risk by itself, under a condition: All four Polly songs; Polly shared memory 1; Polly shared memory 2; Polly shared memory 3; Polly shared memory 4. At risk when you act: Polly shared memory 5; Polly shared memory 6; Polly shared memory 7; Polly shared memory 8; Polly shared memory 9; Polly shared memory 10; Polly shared memory 11; Polly shared memory 12; Polly shared memory 13; Polly shared memory 14; Polly shared memory 15; Polly shared memory 16; Polly button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ]
 },
 "disagreements": [
  {
   "topic": "Hidden drum range and high-key turns",
   "docs_say": "The drum Sound display has no Low, High or high-key controls.",
   "source_says": "The display hides those controls, but band-instrument KNOB 3 and 4 on Sound still change stored range limits and KNOB 1 on Sound 2 still changes the stored high-key value, including for drums.",
   "docs_ref": {
    "kind": "doc",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "MANUAL.md",
    "lines": "1055-1065",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/MANUAL.md#L1055-L1065"
   },
   "source_ref": {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "3849-3867",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3849-L3867"
   },
   "owner_summary": "The guide omits drum range and high-key controls, and the screen hides them. KNOB 3 and 4 on Sound still change stored range limits for drums; KNOB 1 on Sound 2 still changes their stored high-key value. An audible effect is not established."
  },
  {
   "topic": "Lights off still permits navigation and mute indicators",
   "docs_say": "The Setup table says off leaves the keys dark.",
   "source_says": "Off removes held-key feedback, but HOME shortcuts and the Song mute indicators still use the key lights.",
   "docs_ref": {
    "kind": "doc",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "MANUAL.md",
    "lines": "1287",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/MANUAL.md#L1287"
   },
   "source_ref": {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "4238-4257",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4238-L4257"
   },
   "owner_summary": "The Setup table describes Lights off as leaving the keys dark. HOME shortcuts and Song mute indicators still use the key lights."
  }
 ],
 "not_mapped": [],
 "licence_note": "GPL-3.0-only application and platform; bundled Sonivox EAS uses Apache-2.0, fonts use OFL-1.1, and factory drum material uses CC-BY-4.0.",
 "licence_source": [
  {
   "kind": "doc",
   "repo": "charlesvestal/fm1-polly",
   "ref": "v0.4.3",
   "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
   "path": "LICENSING.md",
   "lines": "3-24",
   "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/LICENSING.md#L3-L24"
  }
 ],
 "groups": {
  "key_lights": [
   "led_f3",
   "led_fs3",
   "led_g3",
   "led_gs3",
   "led_a3",
   "led_as3",
   "led_b3",
   "led_c4",
   "led_cs4",
   "led_d4",
   "led_ds4",
   "led_e4",
   "led_f4",
   "led_fs4",
   "led_g4",
   "led_gs4",
   "led_a4",
   "led_as4",
   "led_b4",
   "led_c5",
   "led_cs5",
   "led_d5",
   "led_ds5",
   "led_e5",
   "led_f5",
   "led_fs5",
   "led_g5"
  ]
 },
 "status": "Independently checked: zero errors in round 3 (2026-10-16), after the round-1 and round-2 fixes. No device testing.",
 "evidence_note": "Read against the source snapshot at v0.4.3; no behavior was tested on an FM-1.",
 "refresh_check_fixes": [
  {
   "round": 1,
   "error": "1 QY70 installation and undo",
   "fixed": "Added bank installation, failure and unsaved-groove risks, transfer screen, and restore/bank undo-history clearing.",
   "at": "controls.jack_usb_c[0,1]; controls.button_rec[12]; controls.screen[31]; storage objects[polly.qy70_bank]"
  },
  {
   "round": 1,
   "error": "2 shared groove save",
   "fixed": "SAVE, switching guidance and storage triggers now say that only the newest changed shared-groove version is saved and replaces the others.",
   "at": "controls.button_save[0]; switching_note.kept_on_unit; storage save/autosave triggers"
  },
  {
   "round": 1,
   "error": "3 full memory and SAVE light",
   "fixed": "Qualified chord and track recording/save claims; documented unkept groove takes, discarded melody notes, unkept oversized progressions, retry after freeing memory and the potentially dark SAVE light.",
   "at": "controls.button_rec[2:5,7:12]; controls.button_save[0]; lights.button_save[1]; saving_limits; switching_note.kept_on_unit; storage save/autosave triggers"
  },
  {
   "round": 1,
   "error": "4 invented update disagreement",
   "fixed": "Removed the unsupported update-survival disagreement and older-release uncertainty from owner guidance; retained exact format validators as technical facts without claiming published-version incompatibility.",
   "at": "disagreements[removed former 0]; not_mapped; switching_note.lost; storage.backup.downgrade"
  },
  {
   "round": 1,
   "error": "6 armed Song shortcut while stopped",
   "fixed": "Distinguished stopped insertion at the cursor from playing replacement/current-next-section recording for all sixteen HOME white-key shortcuts.",
   "at": "controls.key_f3[25]; controls.key_g3[25]; controls.key_a3[25]; controls.key_b3[25]; controls.key_c4[25]; controls.key_d4[25]; controls.key_e4[25]; controls.key_f4[25]; controls.key_g4[25]; controls.key_a4[25]; controls.key_b4[25]; controls.key_c5[25]; controls.key_d5[25]; controls.key_e5[25]; controls.key_f5[25]; controls.key_g5[25]"
  },
  {
   "round": 1,
   "error": "7 computer-started update",
   "fixed": "Added an explicit computer-update entry and broadened save-first guidance to every update route.",
   "at": "controls.jack_usb_c[2]; switching_note.back_up_first; storage.install_and_startup_writes[5]"
  },
  {
   "round": 1,
   "error": "8 Notes bass question",
   "fixed": "Added the question screen and SEL confirmation, including Chord 1, undo, save timing and declining the question, and linked it from the pitch control.",
   "at": "controls.button_sel[27]; controls.screen[32]; controls.encoder_knob2[17]; storage shared-slot write notes"
  },
  {
   "round": 1,
   "error": "11 SAVE copy refusal",
   "fixed": "Replaced no-op descriptions with the actual COPY refusal on ten pages, preserving Song and black-key no-ops.",
   "at": "160 white-key entries: controls.key_f3[33]; controls.key_f3[34]; controls.key_f3[35]; controls.key_f3[36]; controls.key_f3[37]; controls.key_f3[38]; controls.key_f3[39]; controls.key_f3[40]; controls.key_f3[41]; controls.key_f3[42]; controls.key_g3[33]; controls.key_g3[34]; controls.key_g3[35]; controls.key_g3[36]; controls.key_g3[37]; controls.key_g3[38]; controls.key_g3[39]; controls.key_g3[40]; controls.key_g3[41]; controls.key_g3[42]; controls.key_a3[33]; controls.key_a3[34]; controls.key_a3[35]; controls.key_a3[36]; controls.key_a3[37]; controls.key_a3[38]; controls.key_a3[39]; controls.key_a3[40]; controls.key_a3[41]; controls.key_a3[42]; controls.key_b3[33]; controls.key_b3[34]; controls.key_b3[35]; controls.key_b3[36]; controls.key_b3[37]; controls.key_b3[38]; controls.key_b3[39]; controls.key_b3[40]; controls.key_b3[41]; controls.key_b3[42]; controls.key_c4[33]; controls.key_c4[34]; controls.key_c4[35]; controls.key_c4[36]; controls.key_c4[37]; controls.key_c4[38]; controls.key_c4[39]; controls.key_c4[40]; controls.key_c4[41]; controls.key_c4[42]; controls.key_d4[33]; controls.key_d4[34]; controls.key_d4[35]; controls.key_d4[36]; controls.key_d4[37]; controls.key_d4[38]; controls.key_d4[39]; controls.key_d4[40]; controls.key_d4[41]; controls.key_d4[42]; controls.key_e4[33]; controls.key_e4[34]; controls.key_e4[35]; controls.key_e4[36]; controls.key_e4[37]; controls.key_e4[38]; controls.key_e4[39]; controls.key_e4[40]; controls.key_e4[41]; controls.key_e4[42]; controls.key_f4[33]; controls.key_f4[34]; controls.key_f4[35]; controls.key_f4[36]; controls.key_f4[37]; controls.key_f4[38]; controls.key_f4[39]; controls.key_f4[40]; controls.key_f4[41]; controls.key_f4[42]; controls.key_g4[33]; controls.key_g4[34]; controls.key_g4[35]; controls.key_g4[36]; controls.key_g4[37]; controls.key_g4[38]; controls.key_g4[39]; controls.key_g4[40]; controls.key_g4[41]; controls.key_g4[42]; controls.key_a4[33]; controls.key_a4[34]; controls.key_a4[35]; controls.key_a4[36]; controls.key_a4[37]; controls.key_a4[38]; controls.key_a4[39]; controls.key_a4[40]; controls.key_a4[41]; controls.key_a4[42]; controls.key_b4[33]; controls.key_b4[34]; controls.key_b4[35]; controls.key_b4[36]; controls.key_b4[37]; controls.key_b4[38]; controls.key_b4[39]; controls.key_b4[40]; controls.key_b4[41]; controls.key_b4[42]; controls.key_c5[33]; controls.key_c5[34]; controls.key_c5[35]; controls.key_c5[36]; controls.key_c5[37]; controls.key_c5[38]; controls.key_c5[39]; controls.key_c5[40]; controls.key_c5[41]; controls.key_c5[42]; controls.key_d5[33]; controls.key_d5[34]; controls.key_d5[35]; controls.key_d5[36]; controls.key_d5[37]; controls.key_d5[38]; controls.key_d5[39]; controls.key_d5[40]; controls.key_d5[41]; controls.key_d5[42]; controls.key_e5[33]; controls.key_e5[34]; controls.key_e5[35]; controls.key_e5[36]; controls.key_e5[37]; controls.key_e5[38]; controls.key_e5[39]; controls.key_e5[40]; controls.key_e5[41]; controls.key_e5[42]; controls.key_f5[33]; controls.key_f5[34]; controls.key_f5[35]; controls.key_f5[36]; controls.key_f5[37]; controls.key_f5[38]; controls.key_f5[39]; controls.key_f5[40]; controls.key_f5[41]; controls.key_f5[42]; controls.key_g5[33]; controls.key_g5[34]; controls.key_g5[35]; controls.key_g5[36]; controls.key_g5[37]; controls.key_g5[38]; controls.key_g5[39]; controls.key_g5[40]; controls.key_g5[41]; controls.key_g5[42]"
  },
  {
   "round": 1,
   "error": "12 author installer link",
   "fixed": "Added the author’s installer beside the release and community hub links.",
   "at": "install.installer; installer_source; polly.md title line"
  },
  {
   "round": 1,
   "error": "13 incoming MIDI channel settings",
   "fixed": "Added the omitted stored channel values, including the channel-10 program exception; qualified flash timing and disputed only the unconditional next-save claim.",
   "at": "controls.jack_midi_in[1]; checker_disputes_refresh; storage.objects[polly.project]"
  },
  {
   "round": 1,
   "error": "14 CLEAR SECTIONS options",
   "fixed": "Named the Intro-on, Ending-on and At-end-stop resets.",
   "at": "controls.button_sel[12]; storage.objects[polly.songs] write notes"
  },
  {
   "round": 1,
   "error": "coverage remote panel",
   "fixed": "Added the Mirror page’s remote key, button and encoder control and the physical-restore exception.",
   "at": "controls.jack_usb_c[3]"
  },
  {
   "round": 1,
   "error": "coverage four failed starts",
   "fixed": "Documented the automatic fallback beyond Safe mode.",
   "at": "controls.screen[33]; modes[safe_mode]"
  },
  {
   "round": 1,
   "error": "9 startup staging cleanup",
   "fixed": "Added the full five-sector conditional startup erase, independently of journal cleanup, to the stock and Baud Girl overlap rows.",
   "at": "storage.reads_foreign[0,3,4]"
  },
  {
   "round": 1,
   "error": "10 tidy after failed song load",
   "fixed": "Made explicit that a failed song load produces defaults and startup then frees all recognized nonempty orphan overflow-progression slots.",
   "at": "storage.install_and_startup_writes[4]; storage.objects[polly.slot_01..polly.slot_16].written_when"
  },
  {
   "round": 1,
   "error": "5 four missing atlas firmwares",
   "fixed": "Appended one comparison per overlapping AMB, ChoralRoot, GHOULBOX and M-VAVE Open atlas object, including accepted AMB calibration, rejected AMB project data and Open records overwritten by install.",
   "at": "storage.reads_foreign[84:156]"
  },
  {
   "round": 2,
   "error": "1 HOME white-key mutually exclusive branches",
   "fixed": "Reworded all sixteen shortcuts with explicit if/otherwise cases: section recording edits song sections instead of picking a progression, and ordinary use picks a progression; matching guide rows updated.",
   "at": "controls.key_f3[25]; controls.key_g3[25]; controls.key_a3[25]; controls.key_b3[25]; controls.key_c4[25]; controls.key_d4[25]; controls.key_e4[25]; controls.key_f4[25]; controls.key_g4[25]; controls.key_a4[25]; controls.key_b4[25]; controls.key_c5[25]; controls.key_d5[25]; controls.key_e5[25]; controls.key_f5[25]; controls.key_g5[25]"
  }
 ],
 "saving_limits": {
  "shared_grooves": "If several sections use one edited groove and diverge, saving keeps the most recently changed version and replaces the other sections’ versions.",
  "full_memory": "When a change needs another memory place and all sixteen are occupied, groove changes can play without being kept, melody notes needing extra space are discarded, and progressions exceeding the songs’ shared room remain unkept. SAVE can stay dark. Free enough places before leaving or switching off; record discarded melody notes again.",
  "source": [
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "697-738",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L697-L738"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "419-445",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L419-L445"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "486-508",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L486-L508"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "544-578",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L544-L578"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/ui.c",
    "lines": "3264-3283",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L3264-L3283"
   },
   {
    "kind": "source",
    "repo": "charlesvestal/fm1-polly",
    "ref": "v0.4.3",
    "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
    "path": "firmware/src/app/pages.c",
    "lines": "322-331",
    "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/pages.c#L322-L331"
   }
  ]
 },
 "installer_source": [
  {
   "kind": "doc",
   "repo": "charlesvestal/fm1-polly",
   "ref": "v0.4.3",
   "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
   "path": "README.md",
   "lines": "8",
   "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/README.md#L8"
  }
 ],
 "checker_disputes_refresh": [
  {
   "round": 1,
   "error": "13 unconditional next-save timing",
   "why": "The omitted channel-setting updates are real and now mapped, but MIDI input only assigns the project fields and never marks settings dirty; SAVE writes the project only when its dirty flag is set, so incoming messages alone are not guaranteed to reach flash on the next SAVE.",
   "evidence": [
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "4092-4124",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L4092-L4124"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "106-111",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L106-L111"
    },
    {
     "kind": "source",
     "repo": "charlesvestal/fm1-polly",
     "ref": "v0.4.3",
     "commit": "abf32e87853724c563493c4296b0b6cf8f2d2470",
     "path": "firmware/src/app/ui.c",
     "lines": "669-680",
     "url": "https://github.com/charlesvestal/fm1-polly/blob/abf32e87853724c563493c4296b0b6cf8f2d2470/firmware/src/app/ui.c#L669-L680"
    }
   ]
  }
 ]
}