{
 "firmware": "PIGEON",
 "slug": "pigeon",
 "author": "The Shrimp Blimp; based on Felucca by Leo Kuroshita / Hügelton Instruments",
 "repo": "https://github.com/TheShrimpBlimp/pigeon",
 "licence": "GPL-3.0-only",
 "closed_source": false,
 "mapped_release": "v0.3.1",
 "mapped_commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
 "release_date": "2026-10-16",
 "date_mapped": "2026-10-17",
 "status": "Independently checked: zero errors in round 3 (2026-10-17). No device testing.",
 "turns_it_into": "A performance sampler with two chopped songs, sixteen drum pads, three-track sequencing, four saved phrases and an arrangement.",
 "docs": [
  {
   "title": "Overview",
   "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/README.md",
   "words": 1061,
   "read_at": "v0.3.1 (113f6e638626a7738c48199fef3bb78f36a8a51c)"
  },
  {
   "title": "Tutorial",
   "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/docs/KO_MODE.md",
   "words": 1272,
   "read_at": "v0.3.1 (113f6e638626a7738c48199fef3bb78f36a8a51c)"
  },
  {
   "title": "Controls",
   "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/docs/PIGEON_CONTROLS.md",
   "words": 1268,
   "read_at": "v0.3.1 (113f6e638626a7738c48199fef3bb78f36a8a51c)"
  },
  {
   "title": "Storage",
   "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/docs/KO_STORAGE.md",
   "words": 1946,
   "read_at": "v0.3.1 (113f6e638626a7738c48199fef3bb78f36a8a51c)"
  },
  {
   "title": "Update recovery",
   "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/docs/PIGEON_RECOVERY.md",
   "words": 538,
   "read_at": "v0.3.1 (113f6e638626a7738c48199fef3bb78f36a8a51c)"
  },
  {
   "title": "Sample tool",
   "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/web/pigeon/README.md",
   "words": 2127,
   "read_at": "v0.3.1 (113f6e638626a7738c48199fef3bb78f36a8a51c)"
  }
 ],
 "install": {
  "official": "https://github.com/TheShrimpBlimp/pigeon/releases/tag/v0.3.1",
  "hub": "https://thefirmwarehub.com/"
 },
 "part_id_notes": "SEL is called SCL in the source and the PIGEON docs; ALGORITHM chooses Song 1, Drums, then Song 2; there are no encoder pushes; lights use button part ids and the key_lights group.",
 "modes": [
  {
   "id": "wave",
   "name": "Song waveform",
   "how_to_get_there": "Choose Song 1 or Song 2 with ALGORITHM and press HOME from another page.",
   "what_it_is": "Shows the selected chop, its boundaries, waveform, pitch and playback position, or an empty song prompt.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "542-562",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L542-L562"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko.c",
     "lines": "85-128",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L85-L128"
    }
   ]
  },
  {
   "id": "kit",
   "name": "Drum kit",
   "how_to_get_there": "Choose Drums with ALGORITHM and press HOME from another page.",
   "what_it_is": "Shows the kit and its level, pitch, crush and tone controls.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "563-568",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L563-L568"
    }
   ]
  },
  {
   "id": "fx1",
   "name": "FX amounts",
   "how_to_get_there": "Press FX outside the tempo and chop-operation branches.",
   "what_it_is": "Shows the selected track filter, delay send, chorus send and reverb send.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "661-667",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L661-L667"
    }
   ]
  },
  {
   "id": "fx2",
   "name": "FX drive",
   "how_to_get_there": "Press FX from FX amounts.",
   "what_it_is": "Shows drive, shared delay time and feedback, and selected track level.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "668-675",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L668-L675"
    }
   ]
  },
  {
   "id": "compressor",
   "name": "Compressor",
   "how_to_get_there": "Press ENV outside a branch with its own ENV action.",
   "what_it_is": "Shows threshold, ratio, attack and release for the selected song or kit compressor.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "683-691",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L683-L691"
    }
   ]
  },
  {
   "id": "makeup",
   "name": "Makeup gain",
   "how_to_get_there": "Press LFO outside a branch with its own LFO action.",
   "what_it_is": "Shows compressor makeup gain and bypass status, with bypass when ratio is 1:1 and makeup is zero.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "692-699",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L692-L699"
    }
   ]
  },
  {
   "id": "chops",
   "name": "Chop playback",
   "how_to_get_there": "On a song waveform, press EDIT.",
   "what_it_is": "Shows held loop, latch, split/join and chop undo controls.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "676-682",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L676-L682"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko.c",
     "lines": "138-171",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L138-L171"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko.c",
     "lines": "219-226",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L219-L226"
    }
   ]
  },
  {
   "id": "envelope",
   "name": "Chop envelope",
   "how_to_get_there": "On Chop playback, press ENV.",
   "what_it_is": "Shows chop attack, release, trigger mode and looping.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "607-614",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L607-L614"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko.c",
     "lines": "206-217",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
    }
   ]
  },
  {
   "id": "chop_ops",
   "name": "Copy and split",
   "how_to_get_there": "On Chop playback, press LFO.",
   "what_it_is": "Shows destination chop, copy source, duplicate/split and settings-copy/join commands.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "619-622",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L619-L622"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko.c",
     "lines": "148-178",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L148-L178"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko.c",
     "lines": "200-226",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L200-L226"
    }
   ]
  },
  {
   "id": "key_assign",
   "name": "Swap and move",
   "how_to_get_there": "On Copy and split, press ENV.",
   "what_it_is": "Shows the source and destination chop keys and the swap and move commands.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "615-618",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L615-L618"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko.c",
     "lines": "188-198",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L188-L198"
    }
   ]
  },
  {
   "id": "choke_layout",
   "name": "Choke layout",
   "how_to_get_there": "On Copy and split, press FX.",
   "what_it_is": "Shows the selected chop choke group, active layout, song gain and layout-copy command.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "598-603",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L598-L603"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko.c",
     "lines": "285-295",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L285-L295"
    }
   ]
  },
  {
   "id": "grid",
   "name": "Sequence grid",
   "how_to_get_there": "Press SEQ from another page, or from the piano roll.",
   "what_it_is": "Shows a sixteen-step page of the 1–64-step sequence, current step, notes per step, timing and transport state.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "569-578",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L569-L578"
    }
   ]
  },
  {
   "id": "roll",
   "name": "Piano roll",
   "how_to_get_there": "Press SEQ on the sequence grid.",
   "what_it_is": "Shows the same sequence as note rows with up to four notes per step.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "482-485",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L482-L485"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "416-460",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L416-L460"
    }
   ]
  },
  {
   "id": "step",
   "name": "Step dynamics",
   "how_to_get_there": "Press ENV on the grid, roll or Timing.",
   "what_it_is": "Shows the selected step velocity, gate, chance and repeats.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "642-647",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L642-L647"
    }
   ]
  },
  {
   "id": "step_pitch",
   "name": "Step pitch",
   "how_to_get_there": "Press ENV on Step dynamics.",
   "what_it_is": "Shows step pitch, microtiming, play condition and the step number, with a misleading PRESETS hint.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "592-597",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L592-L597"
    }
   ]
  },
  {
   "id": "timing",
   "name": "Timing",
   "how_to_get_there": "Press LFO on the grid, roll or Step dynamics.",
   "what_it_is": "Shows selected-track swing, default gate and global tempo.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "648-651",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L648-L651"
    }
   ]
  },
  {
   "id": "record_prefs",
   "name": "Recording",
   "how_to_get_there": "Press LFO on Timing.",
   "what_it_is": "Shows metronome, count-in, live quantization and song choke preferences.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "623-628",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L623-L628"
    }
   ]
  },
  {
   "id": "tempo",
   "name": "Tempo tools",
   "how_to_get_there": "Press GLO, or press ENV on Recording.",
   "what_it_is": "Shows tempo, reference beat count, calculated chop tempo and chop choice.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "579-584",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L579-L584"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "102-105",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L102-L105"
    }
   ]
  },
  {
   "id": "speed_sync",
   "name": "Speed sync",
   "how_to_get_there": "On a song in Tempo tools, press FX.",
   "what_it_is": "Shows captured reference beat count, sync enable, whole-song or chop reference and speed factor.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "585-591",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L585-L591"
    }
   ]
  },
  {
   "id": "pad",
   "name": "Drum pad",
   "how_to_get_there": "On the kit HOME page, press ENV.",
   "what_it_is": "Shows pitch, level, decay and choke group for the last white key played.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "637-641",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L637-L641"
    }
   ]
  },
  {
   "id": "rolls",
   "name": "Drum rolls",
   "how_to_get_there": "On Drum pad, press LFO.",
   "what_it_is": "Shows the held-pad roll rate and roll enable setting.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "604-606",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L604-L606"
    }
   ]
  },
  {
   "id": "mix_level",
   "name": "Mixer levels",
   "how_to_get_there": "Cycle ARP: levels, mute/solo, delay, chorus, reverb, waveform.",
   "what_it_is": "Shows Song 1, kit and Song 2 track levels and selected-track pan.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_arrange_ui.c",
     "lines": "3-16",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L16"
    }
   ]
  },
  {
   "id": "mix_delay",
   "name": "Mixer delay",
   "how_to_get_there": "Cycle ARP: levels, mute/solo, delay, chorus, reverb, waveform.",
   "what_it_is": "Shows Song 1, kit and Song 2 track delay sends and selected-track pan.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_arrange_ui.c",
     "lines": "3-16",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L16"
    }
   ]
  },
  {
   "id": "mix_chorus",
   "name": "Mixer chorus",
   "how_to_get_there": "Cycle ARP: levels, mute/solo, delay, chorus, reverb, waveform.",
   "what_it_is": "Shows Song 1, kit and Song 2 track chorus sends and selected-track pan.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_arrange_ui.c",
     "lines": "3-16",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L16"
    }
   ]
  },
  {
   "id": "mix_reverb",
   "name": "Mixer reverb",
   "how_to_get_there": "Cycle ARP: levels, mute/solo, delay, chorus, reverb, waveform.",
   "what_it_is": "Shows Song 1, kit and Song 2 track reverb sends and selected-track pan.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_arrange_ui.c",
     "lines": "3-16",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L16"
    }
   ]
  },
  {
   "id": "mute_solo",
   "name": "Mute and solo",
   "how_to_get_there": "Press ARP on Mixer levels.",
   "what_it_is": "Shows three track mutes and a persistent solo choice.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "656-660",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L656-L660"
    }
   ]
  },
  {
   "id": "patterns",
   "name": "Patterns",
   "how_to_get_there": "Press SEL once from another page.",
   "what_it_is": "Shows saved or empty A–D destinations, the current selection, unsaved state, clipboard and queued launch.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_arrange_ui.c",
     "lines": "41-56",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L41-L56"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_arrange.c",
     "lines": "65-85",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L65-L85"
    }
   ]
  },
  {
   "id": "arrangement",
   "name": "Arrangement",
   "how_to_get_there": "Press SEL on Patterns.",
   "what_it_is": "Shows the selected or playing section, its phrase and repeat count, with up to sixteen sections.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_arrange_ui.c",
     "lines": "57-69",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L57-L69"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_arrange.c",
     "lines": "65-85",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L65-L85"
    }
   ]
  },
  {
   "id": "arr_tools",
   "name": "Launch tools",
   "how_to_get_there": "Press ENV on Patterns or Arrangement.",
   "what_it_is": "Shows the launch boundary, section move and duplicate commands, and section number.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "633-636",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L633-L636"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_arrange.c",
     "lines": "130-145",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L130-L145"
    }
   ]
  },
  {
   "id": "variations",
   "name": "Variations",
   "how_to_get_there": "Press ENV on Launch tools.",
   "what_it_is": "Shows a duplicate destination, track-note clear, track-lock clear and duplicate command.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_ui.c",
     "lines": "629-632",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L629-L632"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_arrange.c",
     "lines": "87-110",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L87-L110"
    }
   ]
  },
  {
   "id": "settings_display",
   "name": "Settings / Display",
   "how_to_get_there": "Press HOME on the waveform or kit, then choose DISPLAY with ALGORITHM.",
   "what_it_is": "Shows ANIM: off/on/idle animation; LEDS: off/dim low/dim high/inverted; SCREEN OFF: never or 5/15/30/60 minutes.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/menu_items.c",
     "lines": "36-84",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L36-L84"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_menu.c",
     "lines": "428-505",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L428-L505"
    }
   ]
  },
  {
   "id": "settings_control",
   "name": "Settings / Control",
   "how_to_get_there": "Press HOME on the waveform or kit, then choose CONTROL with ALGORITHM.",
   "what_it_is": "Shows HOLD: 0.3/0.4/0.5/0.6 seconds for GLO and SEQ layers; BPM LOCK: restrict SELECT tempo to GLO held.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/menu_items.c",
     "lines": "36-84",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L36-L84"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_menu.c",
     "lines": "428-505",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L428-L505"
    }
   ]
  },
  {
   "id": "settings_audio",
   "name": "Settings / Audio",
   "how_to_get_there": "Press HOME on the waveform or kit, then choose AUDIO with ALGORITHM.",
   "what_it_is": "Shows SPEAKER EQ: flat/lowcut/bass boost across outputs; USB LEVEL: master/fixed; CLICK: off/record/on; CLICK LEVEL: low/mid/high; COUNT-IN: off/one/two bars; TUNE: ±50 cents.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/menu_items.c",
     "lines": "36-84",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L36-L84"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_menu.c",
     "lines": "428-505",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L428-L505"
    }
   ]
  },
  {
   "id": "settings_midi",
   "name": "Settings / Midi",
   "how_to_get_there": "Press HOME on the waveform or kit, then choose MIDI with ALGORITHM.",
   "what_it_is": "Shows MIDI IN routing and LEARN CLEAR; MIDI IN belongs to the project, while clearing learned controls saves the changed preference map.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/menu_items.c",
     "lines": "36-84",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L36-L84"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_menu.c",
     "lines": "428-505",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L428-L505"
    }
   ]
  },
  {
   "id": "settings_system",
   "name": "Settings / System",
   "how_to_get_there": "Press HOME on the waveform or kit, then choose SYSTEM with ALGORITHM.",
   "what_it_is": "Shows RESTORE LAST controls project autosave/restore; CALIBRATION teaches buttons and encoders; INFO shows firmware/USB/CPU; ABOUT opens credits.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/menu_items.c",
     "lines": "36-84",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L36-L84"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_menu.c",
     "lines": "428-505",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L428-L505"
    }
   ]
  },
  {
   "id": "info",
   "name": "Information",
   "how_to_get_there": "Choose Settings > SYSTEM > INFO and release OCT+.",
   "what_it_is": "Shows firmware version, USB state and CPU load.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_menu.c",
     "lines": "380-418",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L380-L418"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_menu.c",
     "lines": "575-578",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L575-L578"
    }
   ]
  },
  {
   "id": "about",
   "name": "About and credits",
   "how_to_get_there": "Choose Settings > SYSTEM > ABOUT and release OCT+.",
   "what_it_is": "Shows project information and scrollable credits.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_menu.c",
     "lines": "546-552",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L552"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_menu.c",
     "lines": "579-582",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L579-L582"
    }
   ]
  },
  {
   "id": "glo_layer",
   "name": "GLO shortcuts",
   "how_to_get_there": "Hold GLO for the HOLD setting time or use a key or knob while holding it.",
   "what_it_is": "A temporary mixer overlay with three levels, held solos, mute keys, unmute, tap tempo and MIDI LEARN.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "197-215",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L215"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "442-459",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L442-L459"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "497-507",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L497-L507"
    }
   ]
  },
  {
   "id": "seq_layer",
   "name": "SEQ tools",
   "how_to_get_there": "Hold SEQ for the HOLD setting time or use a key or knob while holding it.",
   "what_it_is": "A temporary track-tools overlay with length, duration, swing and gate; its first opening can save settings even with no edit.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "167-185",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L167-L185"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "197-215",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L215"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "474-478",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
    }
   ]
  },
  {
   "id": "learn",
   "name": "MIDI LEARN",
   "how_to_get_there": "Hold GLO and press D4.",
   "what_it_is": "Learns a received CC for a level selected with GLO-held KNOB 1–3; ordinary sampler-page knobs do not select a learn target.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "457-459",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L457-L459"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "501-507",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L501-L507"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/midi_learn.c",
     "lines": "104-148",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/midi_learn.c#L104-L148"
    }
   ]
  },
  {
   "id": "temp_fx",
   "name": "Temporary FX",
   "how_to_get_there": "Hold LFO first, then press FX while still holding it, and turn a knob on FX amounts or FX drive.",
   "what_it_is": "FX turns are temporary until LFO is released, unless OCT+ keeps them.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1386-1389",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1386-L1389"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1893-1903",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1893-L1903"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1516-1523",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1516-L1523"
    }
   ]
  },
  {
   "id": "calibration",
   "name": "Calibration",
   "how_to_get_there": "Use Settings > SYSTEM > CALIBRATION, or hold both OCT buttons while powering on.",
   "what_it_is": "Prompts for fourteen buttons and seven clockwise encoder turns; any piano key or thirty seconds idle cancels and restores the prior mapping.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1940-2044",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L2044"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/main.c",
     "lines": "189-192",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
    }
   ]
  },
  {
   "id": "update",
   "name": "Update mode",
   "how_to_get_there": "Hold OCT- and OCT+ together for more than five seconds.",
   "what_it_is": "Shows a countdown after two seconds, then enters the USB boot updater, with release before entry cancelling the countdown.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/main.c",
     "lines": "229-255",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L229-L255"
    }
   ]
  },
  {
   "id": "screen_sleep",
   "name": "Sleeping screen",
   "how_to_get_there": "Choose a SCREEN OFF timeout and leave panel input idle.",
   "what_it_is": "The display sleeps; a key, button or encoder wakes it and the waking gesture is swallowed until release and a quiet interval.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui.c",
     "lines": "264-300",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L300"
    }
   ]
  },
  {
   "id": "k_song",
   "name": "Song keys, first bank",
   "how_to_get_there": "Choose Song 1 or Song 2 with ALGORITHM and select a chop from 1–27 with PRESETS.",
   "what_it_is": "Regular playing pages use the 27 keys as chop pads; step editing and the pattern pages have separate key roles.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_state.h",
     "lines": "66-70",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/eng_slice.c",
     "lines": "779-786",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
    }
   ]
  },
  {
   "id": "k_song_later",
   "name": "Song keys, later bank",
   "how_to_get_there": "Select chop 28–32 with PRESETS on a song track.",
   "what_it_is": "The first five white keys reach chops 28–32; the remaining keys are silent.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko.c",
     "lines": "75-83",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L75-L83"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/eng_slice.c",
     "lines": "779-786",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
    }
   ]
  },
  {
   "id": "k_kit",
   "name": "Kit keys",
   "how_to_get_there": "Choose the drum kit with ALGORITHM.",
   "what_it_is": "The sixteen white keys play its pads; the black keys have no sound.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/eng_sample.c",
     "lines": "241-245",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
    }
   ]
  },
  {
   "id": "k_toggle",
   "name": "Stopped note editing",
   "how_to_get_there": "Stop playback, disarm the selected track, and open the grid, piano roll or Step Dynamics.",
   "what_it_is": "Keys add or remove notes at the selected step without sounding them or advancing; four distinct notes fit.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1797-1825",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1825"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/seq.c",
     "lines": "870-895",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
    }
   ]
  },
  {
   "id": "k_step_rec",
   "name": "Stopped armed entry",
   "how_to_get_there": "Hold FX, press SEQ, tap and release REC while FX remains held, then release FX.",
   "what_it_is": "The first note replaces the step and up to four notes form a chord; releasing its final held key advances once.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/seq.c",
     "lines": "654-685",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L685"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1531-1536",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "95-107",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1303-1317",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1303-L1317"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "197-205",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L205"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1685-1689",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1685-L1689"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1741-1744",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1741-L1744"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "595-617",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L595-L617"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1607-1608",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1607-L1608"
    }
   ]
  },
  {
   "id": "k_live_rec",
   "name": "Live recording",
   "how_to_get_there": "While playback runs, hold FX, tap and release REC while FX remains held, then release FX.",
   "what_it_is": "Playable keys perform and record onto the running sequence; optional live quantization affects their timing.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/seq.c",
     "lines": "630-639",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/seq.c",
     "lines": "667-695",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1531-1536",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "95-107",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1303-1317",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1303-L1317"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "197-205",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L205"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1685-1689",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1685-L1689"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1741-1744",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1741-L1744"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "595-631",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L595-L631"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1607-1608",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1607-L1608"
    }
   ]
  },
  {
   "id": "k_patterns",
   "name": "Pattern selection keys",
   "how_to_get_there": "Press SEL to open Patterns.",
   "what_it_is": "The first four white keys request A–D and the other keys remain silent.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_arrange.c",
     "lines": "168-173",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1797-1829",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
    }
   ]
  },
  {
   "id": "k_arrange",
   "name": "Arrangement keys",
   "how_to_get_there": "Press SEL again from Patterns.",
   "what_it_is": "The first four white keys append a section containing A–D after the selected section.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_arrange.c",
     "lines": "112-118",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L112-L118"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ko_arrange.c",
     "lines": "168-173",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
    }
   ]
  },
  {
   "id": "k_arrange_tools",
   "name": "Keys on arrangement tools",
   "how_to_get_there": "Open Arrangement, then press ENV.",
   "what_it_is": "Keys have no action on this page.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1797-1829",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
    }
   ]
  },
  {
   "id": "k_variations",
   "name": "Keys on pattern variations",
   "how_to_get_there": "From Arrangement tools press ENV again.",
   "what_it_is": "Keys have no action on this page.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1797-1829",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
    }
   ]
  },
  {
   "id": "k_advanced",
   "name": "Keys on stopped Step Pitch + Timing",
   "how_to_get_there": "Open Step Dynamics, then press ENV, while stopped and unarmed.",
   "what_it_is": "This page suppresses the keys without adding or removing step notes.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1797-1829",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
    }
   ]
  },
  {
   "id": "k_glo",
   "name": "GLO held shortcuts",
   "how_to_get_there": "Hold GLO, then use a key.",
   "what_it_is": "White keys provide temporary solos and mixer actions; the first three black keys toggle track mutes.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "443-459",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L443-L459"
    }
   ]
  },
  {
   "id": "k_seq",
   "name": "SEQ held tools",
   "how_to_get_there": "Hold SEQ, then use a key.",
   "what_it_is": "The first six white keys edit the selected track within its current length; later white keys and all black keys have no action for the three sampler tracks.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_tools.c",
     "lines": "14-25",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L14-L25"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/seq.c",
     "lines": "67",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "474-478",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
    }
   ]
  },
  {
   "id": "rec_access",
   "name": "REC with an existing held FX button",
   "how_to_get_there": "Hold FX before using REC, keeping FX down until REC is released; navigate to the needed page while still holding FX.",
   "what_it_is": "A source-traced way to reach recording commands that an ordinary REC tap cannot reach in v0.3.1, without a hardware test.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1531-1536",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "95-107",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1303-1317",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1303-L1317"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "197-205",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L205"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1685-1689",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1685-L1689"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1741-1744",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1741-L1744"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_layer.c",
     "lines": "12-24",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L12-L24"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1607-1608",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1607-L1608"
    }
   ]
  },
  {
   "id": "boot",
   "name": "Start-up and recovery",
   "how_to_get_there": "For recovery, keep only OCT− pressed as you turn the FM-1 on; otherwise start normally.",
   "what_it_is": "A normal start shows the PIGEON splash before the sampler; OCT− alone requests the saved recovery loader or USB boot recovery, signalled by three short flashes or one long flash respectively.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/main.c",
     "lines": "156-159",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L156-L159"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/main.c",
     "lines": "193-209",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L193-L209"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/main.c",
     "lines": "321-342",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L321-L342"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/stub/stub_core.h",
     "lines": "19-25",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub_core.h#L19-L25"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/stub/stub_core.h",
     "lines": "249-279",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub_core.h#L249-L279"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/stub/stub.c",
     "lines": "281-313",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub.c#L281-L313"
    }
   ]
  },
  {
   "id": "k_settings",
   "name": "Playing while Settings is open",
   "how_to_get_there": "Open Settings, Information or About with a song or kit selected.",
   "what_it_is": "Keys still play the selected song bank or kit without changing the chop or pad selected for editing, and follow the existing recording state.",
   "source": [
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_input.c",
     "lines": "1587-1615",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/ui_name.c",
     "lines": "62",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
    },
    {
     "kind": "source",
     "repo": "TheShrimpBlimp/pigeon",
     "ref": "v0.3.1",
     "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
     "path": "firmware/src/seq.c",
     "lines": "870-907",
     "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
    }
   ]
  }
 ],
 "controls": {
  "screen": [
   {
    "mode": "wave",
    "gesture": "shows",
    "short_label": "WAVE",
    "action": "Shows the selected chop, its boundaries, waveform, pitch and playback position, or an empty song prompt.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "542-562",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L542-L562"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "85-128",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L85-L128"
     }
    ]
   },
   {
    "mode": "kit",
    "gesture": "shows",
    "short_label": "DRUM KIT",
    "action": "Shows the kit and its level, pitch, crush and tone controls.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "563-568",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L563-L568"
     }
    ]
   },
   {
    "mode": "fx1",
    "gesture": "shows",
    "short_label": "FX AMOUNTS",
    "action": "Shows the selected track filter, delay send, chorus send and reverb send.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "661-667",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L661-L667"
     }
    ]
   },
   {
    "mode": "fx2",
    "gesture": "shows",
    "short_label": "FX DRIVE",
    "action": "Shows drive, shared delay time and feedback, and selected track level.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "668-675",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L668-L675"
     }
    ]
   },
   {
    "mode": "compressor",
    "gesture": "shows",
    "short_label": "COMPRESSOR",
    "action": "Shows threshold, ratio, attack and release for the selected song or kit compressor.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "683-691",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L683-L691"
     }
    ]
   },
   {
    "mode": "makeup",
    "gesture": "shows",
    "short_label": "MAKEUP GAIN",
    "action": "Shows compressor makeup gain and bypass status, with bypass when ratio is 1:1 and makeup is zero.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "692-699",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L692-L699"
     }
    ]
   },
   {
    "mode": "chops",
    "gesture": "shows",
    "short_label": "CHOPS",
    "action": "Shows held loop, latch, split/join and chop undo controls.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "676-682",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L676-L682"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "138-171",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L138-L171"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "219-226",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L219-L226"
     }
    ]
   },
   {
    "mode": "envelope",
    "gesture": "shows",
    "short_label": "ENVELOPE",
    "action": "Shows chop attack, release, trigger mode and looping.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "607-614",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L607-L614"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "chop_ops",
    "gesture": "shows",
    "short_label": "CHOP OPS",
    "action": "Shows destination chop, copy source, duplicate/split and settings-copy/join commands.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "619-622",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L619-L622"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "148-178",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L148-L178"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "200-226",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L200-L226"
     }
    ]
   },
   {
    "mode": "key_assign",
    "gesture": "shows",
    "short_label": "KEY ASSIGN",
    "action": "Shows the source and destination chop keys and the swap and move commands.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "615-618",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L615-L618"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "188-198",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L188-L198"
     }
    ]
   },
   {
    "mode": "choke_layout",
    "gesture": "shows",
    "short_label": "CHOKE LAYOUT",
    "action": "Shows the selected chop choke group, active layout, song gain and layout-copy command.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "598-603",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L598-L603"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "285-295",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L285-L295"
     }
    ]
   },
   {
    "mode": "grid",
    "gesture": "shows",
    "short_label": "GRID",
    "action": "Shows a sixteen-step page of the 1–64-step sequence, current step, notes per step, timing and transport state.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "569-578",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L569-L578"
     }
    ]
   },
   {
    "mode": "roll",
    "gesture": "shows",
    "short_label": "PIANO ROLL",
    "action": "Shows the same sequence as note rows with up to four notes per step.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "482-485",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L482-L485"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "416-460",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L416-L460"
     }
    ]
   },
   {
    "mode": "step",
    "gesture": "shows",
    "short_label": "STEP",
    "action": "Shows the selected step velocity, gate, chance and repeats.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "642-647",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L642-L647"
     }
    ]
   },
   {
    "mode": "step_pitch",
    "gesture": "shows",
    "short_label": "STEP PITCH",
    "action": "Shows step pitch, microtiming, play condition and the step number, with a misleading PRESETS hint.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "592-597",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L592-L597"
     }
    ]
   },
   {
    "mode": "timing",
    "gesture": "shows",
    "short_label": "TIMING",
    "action": "Shows selected-track swing, default gate and global tempo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "648-651",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L648-L651"
     }
    ]
   },
   {
    "mode": "record_prefs",
    "gesture": "shows",
    "short_label": "RECORDING",
    "action": "Shows metronome, count-in, live quantization and song choke preferences.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "623-628",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L623-L628"
     }
    ]
   },
   {
    "mode": "tempo",
    "gesture": "shows",
    "short_label": "TEMPO TOOLS",
    "action": "Shows tempo, reference beat count, calculated chop tempo and chop choice.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "579-584",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L579-L584"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "102-105",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L102-L105"
     }
    ]
   },
   {
    "mode": "speed_sync",
    "gesture": "shows",
    "short_label": "SPEED SYNC",
    "action": "Shows captured reference beat count, sync enable, whole-song or chop reference and speed factor.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "585-591",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L585-L591"
     }
    ]
   },
   {
    "mode": "pad",
    "gesture": "shows",
    "short_label": "DRUM PAD",
    "action": "Shows pitch, level, decay and choke group for the last white key played.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "637-641",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L637-L641"
     }
    ]
   },
   {
    "mode": "rolls",
    "gesture": "shows",
    "short_label": "DRUM ROLLS",
    "action": "Shows the held-pad roll rate and roll enable setting.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "604-606",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L604-L606"
     }
    ]
   },
   {
    "mode": "mix_level",
    "gesture": "shows",
    "short_label": "LEVELS",
    "action": "Shows Song 1, kit and Song 2 track levels and selected-track pan.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "11-16",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L11-L16"
     }
    ]
   },
   {
    "mode": "mix_delay",
    "gesture": "shows",
    "short_label": "DELAY MIX",
    "action": "Shows Song 1, kit and Song 2 track delay sends and selected-track pan.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "11-16",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L11-L16"
     }
    ]
   },
   {
    "mode": "mix_chorus",
    "gesture": "shows",
    "short_label": "CHORUS MIX",
    "action": "Shows Song 1, kit and Song 2 track chorus sends and selected-track pan.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "11-16",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L11-L16"
     }
    ]
   },
   {
    "mode": "mix_reverb",
    "gesture": "shows",
    "short_label": "REVERB MIX",
    "action": "Shows Song 1, kit and Song 2 track reverb sends and selected-track pan.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "11-16",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L11-L16"
     }
    ]
   },
   {
    "mode": "mute_solo",
    "gesture": "shows",
    "short_label": "MUTE SOLO",
    "action": "Shows three track mutes and a persistent solo choice.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "656-660",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L656-L660"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "shows",
    "short_label": "PATTERNS",
    "action": "Shows saved or empty A–D destinations, the current selection, unsaved state, clipboard and queued launch.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "41-56",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L41-L56"
     }
    ]
   },
   {
    "mode": "arrangement",
    "gesture": "shows",
    "short_label": "ARRANGEMENT",
    "action": "Shows the selected or playing section, its phrase and repeat count, with up to sixteen sections.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "57-69",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L57-L69"
     }
    ]
   },
   {
    "mode": "arr_tools",
    "gesture": "shows",
    "short_label": "LAUNCH TOOLS",
    "action": "Shows the launch boundary, section move and duplicate commands, and section number.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "633-636",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L633-L636"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "130-145",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L130-L145"
     }
    ]
   },
   {
    "mode": "variations",
    "gesture": "shows",
    "short_label": "VARIATIONS",
    "action": "Shows a duplicate destination, track-note clear, track-lock clear and duplicate command.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "629-632",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L629-L632"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "87-110",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L87-L110"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "shows",
    "short_label": "SETTINGS",
    "action": "Shows ANIM: off/on/idle animation; LEDS: off/dim low/dim high/inverted; SCREEN OFF: never or 5/15/30/60 minutes.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "36-84",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L36-L84"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "428-505",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L428-L505"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "shows",
    "short_label": "SETTINGS",
    "action": "Shows HOLD: 0.3/0.4/0.5/0.6 seconds for GLO and SEQ layers; BPM LOCK: restrict SELECT tempo to GLO held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "36-84",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L36-L84"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "428-505",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L428-L505"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "shows",
    "short_label": "SETTINGS",
    "action": "Shows SPEAKER EQ: flat/lowcut/bass boost across outputs; USB LEVEL: master/fixed; CLICK: off/record/on; CLICK LEVEL: low/mid/high; COUNT-IN: off/one/two bars; TUNE: ±50 cents.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "36-84",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L36-L84"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "428-505",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L428-L505"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "shows",
    "short_label": "SETTINGS",
    "action": "Shows MIDI IN routing and LEARN CLEAR; MIDI IN belongs to the project, while clearing learned controls saves the changed preference map.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "36-84",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L36-L84"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "428-505",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L428-L505"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/params.c",
      "lines": "52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/params.c#L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "568-570",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L568-L570"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/midi_learn.c",
      "lines": "71-82",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/midi_learn.c#L71-L82"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "shows",
    "short_label": "SETTINGS",
    "action": "Shows RESTORE LAST controls project autosave/restore; CALIBRATION teaches buttons and encoders; INFO shows firmware/USB/CPU; ABOUT opens credits.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "36-84",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L36-L84"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "428-505",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L428-L505"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "shows",
    "short_label": "INFO",
    "action": "Shows firmware version, USB state and CPU load.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "428-505",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L428-L505"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "shows",
    "short_label": "ABOUT",
    "action": "Shows project information and scrollable credits.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "428-505",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L428-L505"
     }
    ]
   },
   {
    "mode": "glo_layer",
    "gesture": "shows",
    "short_label": "MIX TOOLS",
    "action": "A temporary mixer overlay with three levels, held solos, mute keys, unmute, tap tempo and MIDI LEARN.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "869-894",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L869-L894"
     }
    ]
   },
   {
    "mode": "seq_layer",
    "gesture": "shows",
    "short_label": "SEQ TOOLS",
    "action": "A temporary track-tools overlay with length, duration, swing and gate; its first opening can save settings even with no edit.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "869-894",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L869-L894"
     }
    ]
   },
   {
    "mode": "learn",
    "gesture": "shows",
    "short_label": "MIDI LEARN",
    "action": "Shows the selected parameter and learned controller assignment in the footer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/midi_learn.c",
      "lines": "168-184",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/midi_learn.c#L168-L184"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "shows",
    "short_label": "CALIBRATE",
    "action": "Prompts for fourteen buttons and seven clockwise encoder turns; any piano key or thirty seconds idle cancels and restores the prior mapping.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1944-1952",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1944-L1952"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1985-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1985-L2044"
     }
    ]
   },
   {
    "mode": "update",
    "gesture": "shows",
    "short_label": "USB UPDATE",
    "action": "Shows a countdown after two seconds, then enters the USB boot updater, with release before entry cancelling the countdown.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "229-255",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L229-L255"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "shows",
    "short_label": "SLEEP",
    "action": "The screen is dark until a panel gesture wakes it.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "289-307",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L289-L307"
     }
    ]
   },
   {
    "mode": "rec_access",
    "gesture": "shows",
    "short_label": "REC ROUTE",
    "action": "Shows the chosen sampler page; holding FX first lets a REC tap reach its command on release.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "95-107",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1303-1317",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1303-L1317"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "197-205",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L205"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1685-1689",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1685-L1689"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1741-1744",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1741-L1744"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1607-1608",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1607-L1608"
     }
    ]
   },
   {
    "mode": "boot",
    "gesture": "shows",
    "short_label": "START-UP",
    "action": "A normal start shows the PIGEON splash before the sampler; OCT− alone requests the saved recovery loader or USB boot recovery, signalled by three short flashes or one long flash respectively.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "156-159",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L156-L159"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "193-209",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L193-L209"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "321-342",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L321-L342"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub_core.h",
      "lines": "19-25",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub_core.h#L19-L25"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub_core.h",
      "lines": "249-279",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub_core.h#L249-L279"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub.c",
      "lines": "281-313",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub.c#L281-L313"
     }
    ]
   },
   {
    "mode": "temp_fx",
    "gesture": "shows",
    "short_label": "TEMP FX",
    "action": "Shows the reopened FX page while LFO stays held, with temporary values restored on release unless OCT+ keeps them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1893-1903",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1893-L1903"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1516-1523",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1516-L1523"
     }
    ]
   }
  ],
  "encoder_knob1": [
   {
    "mode": "wave",
    "gesture": "turn",
    "short_label": "START",
    "action": "Moves the selected chop start within the song, with finer movement as you zoom in.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "233-240",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L233-L240"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "85-128",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L85-L128"
     }
    ]
   },
   {
    "mode": "kit",
    "gesture": "turn",
    "short_label": "KIT LEVEL",
    "action": "Sets the drum track level.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "233-240",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L233-L240"
     }
    ]
   },
   {
    "mode": "fx1",
    "gesture": "turn",
    "short_label": "FILTER",
    "action": "Sets the selected track filter, using the kit tone on Drums.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "242-250",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L242-L250"
     }
    ]
   },
   {
    "mode": "fx2",
    "gesture": "turn",
    "short_label": "DRIVE",
    "action": "Sets selected track distortion.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "242-250",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L242-L250"
     }
    ]
   },
   {
    "mode": "compressor",
    "gesture": "turn",
    "short_label": "THRESHOLD",
    "action": "Sets compressor threshold from 0 to −48 dB.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "259-267",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L259-L267"
     }
    ]
   },
   {
    "mode": "makeup",
    "gesture": "turn",
    "short_label": "MAKEUP",
    "action": "Sets compressor makeup gain from 0 to 12 dB.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "259-267",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L259-L267"
     }
    ]
   },
   {
    "mode": "chops",
    "gesture": "turn",
    "short_label": "HELD LOOP",
    "action": "Enables held looping clockwise or disables it anticlockwise for this chop.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "251-258",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L251-L258"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "138-171",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L138-L171"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "219-226",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L219-L226"
     }
    ]
   },
   {
    "mode": "envelope",
    "gesture": "turn",
    "short_label": "CHOP ATTACK",
    "action": "Sets chop attack from 0 to 155 ms in 5 ms steps.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "169-169",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L169"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "chop_ops",
    "gesture": "turn",
    "short_label": "TARGET CHOP",
    "action": "Chooses the destination chop.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "176-180",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L176-L180"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "148-178",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L148-L178"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "200-226",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L200-L226"
     }
    ]
   },
   {
    "mode": "key_assign",
    "gesture": "turn",
    "short_label": "SOURCE CHOP",
    "action": "Chooses the chop assignment to move or swap.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "170-175",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L170-L175"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "188-198",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L188-L198"
     }
    ]
   },
   {
    "mode": "choke_layout",
    "gesture": "turn",
    "short_label": "CHOKE GROUP",
    "action": "Sets the selected chop group from 0 to 3, with zero allowing overlap.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "161-167",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L161-L167"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "285-295",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L285-L295"
     }
    ]
   },
   {
    "mode": "grid",
    "gesture": "turn",
    "short_label": "GRID TEMPO",
    "action": "Sets tempo from 40 to 240 BPM.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "221-230",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L221-L230"
     }
    ]
   },
   {
    "mode": "roll",
    "gesture": "turn",
    "short_label": "ROLL TEMPO",
    "action": "Sets tempo from 40 to 240 BPM.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "221-230",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L221-L230"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "416-460",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L416-L460"
     }
    ]
   },
   {
    "mode": "step",
    "gesture": "turn",
    "short_label": "VELOCITY",
    "action": "Sets step velocity from 1 to 127 while stopped, with sequence undo available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "204-213",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L204-L213"
     }
    ]
   },
   {
    "mode": "step_pitch",
    "gesture": "turn",
    "short_label": "STEP PITCH",
    "action": "Sets a step pitch lock from −24 to +24 semitones while stopped, reporting a full lock store instead of adding a lock.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "150-159",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L150-L159"
     }
    ]
   },
   {
    "mode": "timing",
    "gesture": "turn",
    "short_label": "SWING",
    "action": "Sets track swing from 0 to 100 percent, with sequence undo available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "214-219",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L214-L219"
     }
    ]
   },
   {
    "mode": "record_prefs",
    "gesture": "turn",
    "short_label": "METRONOME",
    "action": "Chooses metronome off, recording only or on.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "182-186",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L182-L186"
     }
    ]
   },
   {
    "mode": "tempo",
    "gesture": "turn",
    "short_label": "TOOL TEMPO",
    "action": "Sets global tempo from 40 to 240 BPM.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "134-139",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L134-L139"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "102-105",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L102-L105"
     }
    ]
   },
   {
    "mode": "speed_sync",
    "gesture": "turn",
    "short_label": "SYNC BEATS",
    "action": "Sets reference length from 1 to 64 beats and recaptures its audio length.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "140-148",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L140-L148"
     }
    ]
   },
   {
    "mode": "pad",
    "gesture": "turn",
    "short_label": "PAD PITCH",
    "action": "Sets the selected pad pitch from −24 to +24 semitones.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "196-202",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L196-L202"
     }
    ]
   },
   {
    "mode": "rolls",
    "gesture": "turn",
    "short_label": "ROLL RATE",
    "action": "Chooses quarter, eighth, sixteenth or thirty-second-note drum rolls.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "168-168",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L168"
     }
    ]
   },
   {
    "mode": "mix_level",
    "gesture": "turn",
    "short_label": "LEVEL 1",
    "action": "Sets the Song 1 levels.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "3-9",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L9"
     }
    ]
   },
   {
    "mode": "mix_delay",
    "gesture": "turn",
    "short_label": "DELAY 1",
    "action": "Sets the Song 1 delay sends.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "3-9",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L9"
     }
    ]
   },
   {
    "mode": "mix_chorus",
    "gesture": "turn",
    "short_label": "CHORUS 1",
    "action": "Sets the Song 1 chorus sends.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "3-9",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L9"
     }
    ]
   },
   {
    "mode": "mix_reverb",
    "gesture": "turn",
    "short_label": "REVERB 1",
    "action": "Sets the Song 1 reverb sends.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "3-9",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L9"
     }
    ]
   },
   {
    "mode": "mute_solo",
    "gesture": "turn",
    "short_label": "MUTE SONG 1",
    "action": "Mutes Song 1 clockwise or unmutes it anticlockwise.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "325-328",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L325-L328"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "turn",
    "short_label": "PATTERN",
    "action": "Selects A–D or queues a saved phrase during pattern playback, requiring the same selection again before discarding unsaved stopped edits.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "130-155",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L130-L155"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "87-110",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L87-L110"
     }
    ]
   },
   {
    "mode": "arrangement",
    "gesture": "turn",
    "short_label": "SECTION",
    "action": "Selects a section.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "112-129",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L112-L129"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "156-164",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L156-L164"
     }
    ]
   },
   {
    "mode": "arr_tools",
    "gesture": "turn",
    "short_label": "LAUNCH",
    "action": "Chooses pattern-end launches clockwise or next-bar launches anticlockwise while stopped.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "130-145",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L130-L145"
     }
    ]
   },
   {
    "mode": "variations",
    "gesture": "turn",
    "short_label": "COPY TO SLOT",
    "action": "Chooses destination A–D while stopped and silent.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "188-195",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L188-L195"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "87-110",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L87-L110"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes the selected valued setting, applied immediately and saved on closing Settings; action-only rows do nothing on a turn.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-567",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L567"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "248-310",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L248-L310"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes the selected valued setting, applied immediately and saved on closing Settings; action-only rows do nothing on a turn.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-567",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L567"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "248-310",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L248-L310"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes the selected audio setting immediately, with TUNE kept by project save or autosave and the other audio preferences saved when Settings closes.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "247-251",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L247-L251"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "287-290",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L287-L290"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/settings_persist.c",
      "lines": "89-100",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/settings_persist.c#L89-L100"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes MIDI IN routing immediately, kept by project save or autosave rather than closing Settings, while LEARN CLEAR does nothing on a turn.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "247-251",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L247-L251"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "289-290",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L289-L290"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/settings_persist.c",
      "lines": "89-100",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/settings_persist.c#L89-L100"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes the selected valued setting, applied immediately and saved on closing Settings; action-only rows do nothing on a turn.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-567",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L567"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "248-310",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L248-L310"
     }
    ]
   },
   {
    "mode": "glo_layer",
    "gesture": "turn_while_holding:button_glo",
    "short_label": "LEVEL 1",
    "action": "Sets the Song 1 level and can select it for MIDI LEARN.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "498-507",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L498-L507"
     }
    ]
   },
   {
    "mode": "seq_layer",
    "gesture": "turn_while_holding:button_seq",
    "short_label": "TOOLS LENGTH",
    "action": "Sets track length from 1 to 64 without clearing hidden later steps.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "28-30",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L28-L30"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "519-527",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L519-L527"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "967-968",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L967-L968"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1057-1065",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1057-L1065"
     }
    ]
   },
   {
    "mode": "temp_fx",
    "gesture": "turn_while_holding:button_lfo",
    "short_label": "TEMP FILTER",
    "action": "On FX amounts, sets the selected track filter, using the kit tone on Drums, restoring it when LFO is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1893-1903",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1893-L1903"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "242-250",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L242-L250"
     }
    ]
   },
   {
    "mode": "temp_fx",
    "gesture": "turn_while_holding:button_lfo",
    "short_label": "TEMP DRIVE",
    "action": "On FX drive, sets selected track distortion, restoring it when LFO is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1893-1903",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1893-L1903"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "242-250",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L242-L250"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "short_label": "TEACH KNOB",
    "action": "When prompted, records this encoder position and clockwise direction; settings are saved by the boot path or when Settings closes without a separate question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2013-2039",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2013-L2039"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "turn",
    "short_label": "WAKE",
    "action": "Wakes the screen without changing a value, with input swallowed until the encoder is quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "encoder_knob2": [
   {
    "mode": "wave",
    "gesture": "turn",
    "short_label": "END",
    "action": "Moves the selected chop end within the song, with finer movement as you zoom in.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "233-240",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L233-L240"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "85-128",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L85-L128"
     }
    ]
   },
   {
    "mode": "kit",
    "gesture": "turn",
    "short_label": "KIT PITCH",
    "action": "Sets the drum track sample pitch.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "233-240",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L233-L240"
     }
    ]
   },
   {
    "mode": "fx1",
    "gesture": "turn",
    "short_label": "DELAY SEND",
    "action": "Sets the selected track delay send.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "242-250",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L242-L250"
     }
    ]
   },
   {
    "mode": "fx2",
    "gesture": "turn",
    "short_label": "DELAY TIME",
    "action": "Sets delay time for the whole setup.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "242-250",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L242-L250"
     }
    ]
   },
   {
    "mode": "compressor",
    "gesture": "turn",
    "short_label": "RATIO",
    "action": "Sets compressor ratio from 1:1 to 8:1.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "259-267",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L259-L267"
     }
    ]
   },
   {
    "mode": "makeup",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "259-267",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L259-L267"
     }
    ]
   },
   {
    "mode": "chops",
    "gesture": "turn",
    "short_label": "LATCH",
    "action": "Enables latch clockwise or disables it anticlockwise for this chop.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "251-258",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L251-L258"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "138-171",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L138-L171"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "219-226",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L219-L226"
     }
    ]
   },
   {
    "mode": "envelope",
    "gesture": "turn",
    "short_label": "CHOP RELEASE",
    "action": "Sets chop release from 0 to 310 ms in 10 ms steps, with zero using the track release.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "169-169",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L169"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "chop_ops",
    "gesture": "turn",
    "short_label": "COPY FROM",
    "action": "Chooses the source chop in this song.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "176-180",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L176-L180"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "148-178",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L148-L178"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "200-226",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L200-L226"
     }
    ]
   },
   {
    "mode": "key_assign",
    "gesture": "turn",
    "short_label": "DESTINATION",
    "action": "Chooses its destination in this song.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "170-175",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L170-L175"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "188-198",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L188-L198"
     }
    ]
   },
   {
    "mode": "choke_layout",
    "gesture": "turn",
    "short_label": "LAYOUT",
    "action": "Selects layout B clockwise or A anticlockwise while stopped and silent, swapping tables and clearing chop undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "161-167",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L161-L167"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "285-295",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L285-L295"
     }
    ]
   },
   {
    "mode": "grid",
    "gesture": "turn",
    "short_label": "END TIMING",
    "action": "Chooses sample-end timing clockwise or tempo timing anticlockwise while stopped, with phrase loops and arrangements always using tempo timing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "221-230",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L221-L230"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "1506-1510",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L1506-L1510"
     }
    ]
   },
   {
    "mode": "roll",
    "gesture": "turn",
    "short_label": "ROLL TIMING",
    "action": "Chooses sample-end timing clockwise or tempo timing anticlockwise while stopped, with phrase loops and arrangements always using tempo timing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "221-230",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L221-L230"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "416-460",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L416-L460"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "1506-1510",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L1506-L1510"
     }
    ]
   },
   {
    "mode": "step",
    "gesture": "turn",
    "short_label": "STEP GATE",
    "action": "Sets a gate lock from 1 to 127 while stopped, reporting a full lock store instead of adding a lock.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "204-213",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L204-L213"
     }
    ]
   },
   {
    "mode": "step_pitch",
    "gesture": "turn",
    "short_label": "NUDGE",
    "action": "Changes step microtiming while stopped and disables track quantization, with sequence undo available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "150-159",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L150-L159"
     }
    ]
   },
   {
    "mode": "timing",
    "gesture": "turn",
    "short_label": "DEFAULT GATE",
    "action": "Sets the track default gate from 1 to 127, with sequence undo available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "214-219",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L214-L219"
     }
    ]
   },
   {
    "mode": "record_prefs",
    "gesture": "turn",
    "short_label": "COUNT-IN",
    "action": "Chooses no count-in, one bar or two bars.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "182-186",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L182-L186"
     }
    ]
   },
   {
    "mode": "tempo",
    "gesture": "turn",
    "short_label": "LOOP BEATS",
    "action": "Sets the reference chop length from 1 to 16 beats.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "134-139",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L134-L139"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "102-105",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L102-L105"
     }
    ]
   },
   {
    "mode": "speed_sync",
    "gesture": "turn",
    "short_label": "SYNC ENABLE",
    "action": "Enables speed sync clockwise or disables it anticlockwise and recaptures the reference length.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "140-148",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L140-L148"
     }
    ]
   },
   {
    "mode": "pad",
    "gesture": "turn",
    "short_label": "PAD LEVEL",
    "action": "Sets the selected pad level from 0 to 127.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "196-202",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L196-L202"
     }
    ]
   },
   {
    "mode": "rolls",
    "gesture": "turn",
    "short_label": "ROLL ENABLE",
    "action": "Enables held-pad rolls clockwise or disables them anticlockwise.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "168-168",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L168"
     }
    ]
   },
   {
    "mode": "mix_level",
    "gesture": "turn",
    "short_label": "LEVEL 2",
    "action": "Sets the kit levels.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "3-9",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L9"
     }
    ]
   },
   {
    "mode": "mix_delay",
    "gesture": "turn",
    "short_label": "DELAY 2",
    "action": "Sets the kit delay sends.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "3-9",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L9"
     }
    ]
   },
   {
    "mode": "mix_chorus",
    "gesture": "turn",
    "short_label": "CHORUS 2",
    "action": "Sets the kit chorus sends.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "3-9",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L9"
     }
    ]
   },
   {
    "mode": "mix_reverb",
    "gesture": "turn",
    "short_label": "REVERB 2",
    "action": "Sets the kit reverb sends.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "3-9",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L9"
     }
    ]
   },
   {
    "mode": "mute_solo",
    "gesture": "turn",
    "short_label": "MUTE KIT",
    "action": "Mutes the kit clockwise or unmutes it anticlockwise.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "325-328",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L325-L328"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "turn",
    "short_label": "COPY SAVED",
    "action": "Copies the chosen saved phrase into the clipboard while stopped without changing flash.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "130-155",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L130-L155"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "87-110",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L87-L110"
     }
    ]
   },
   {
    "mode": "arrangement",
    "gesture": "turn",
    "short_label": "PHRASE",
    "action": "Replaces all section lanes with the chosen A–D phrase while stopped without asking or a dedicated arrangement undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "112-129",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L112-L129"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "156-164",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L156-L164"
     }
    ]
   },
   {
    "mode": "arr_tools",
    "gesture": "turn",
    "short_label": "MOVE SECTION",
    "action": "Moves the selected section left or right while stopped without asking or a dedicated arrangement undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "130-145",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L130-L145"
     }
    ]
   },
   {
    "mode": "variations",
    "gesture": "turn",
    "short_label": "CLEAR NOTES",
    "action": "A turn in either direction clears all 64 steps of this track immediately in memory while stopped and silent without asking, with sequence undo available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "188-195",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L188-L195"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "87-110",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L87-L110"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes the selected valued setting, applied immediately and saved on closing Settings; action-only rows do nothing on a turn.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-567",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L567"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "248-310",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L248-L310"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes the selected valued setting, applied immediately and saved on closing Settings; action-only rows do nothing on a turn.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-567",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L567"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "248-310",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L248-L310"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes the selected audio setting immediately, with TUNE kept by project save or autosave and the other audio preferences saved when Settings closes.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "247-251",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L247-L251"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "287-290",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L287-L290"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/settings_persist.c",
      "lines": "89-100",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/settings_persist.c#L89-L100"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes MIDI IN routing immediately, kept by project save or autosave rather than closing Settings, while LEARN CLEAR does nothing on a turn.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "247-251",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L247-L251"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "289-290",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L289-L290"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/settings_persist.c",
      "lines": "89-100",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/settings_persist.c#L89-L100"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes the selected valued setting, applied immediately and saved on closing Settings; action-only rows do nothing on a turn.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-567",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L567"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "248-310",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L248-L310"
     }
    ]
   },
   {
    "mode": "glo_layer",
    "gesture": "turn_while_holding:button_glo",
    "short_label": "LEVEL 2",
    "action": "Sets the kit level and can select it for MIDI LEARN.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "498-507",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L498-L507"
     }
    ]
   },
   {
    "mode": "seq_layer",
    "gesture": "turn_while_holding:button_seq",
    "short_label": "TOOLS DIV",
    "action": "Sets sequencer step duration.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "28-30",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L28-L30"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "519-527",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L519-L527"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "967-968",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L967-L968"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1057-1065",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1057-L1065"
     }
    ]
   },
   {
    "mode": "temp_fx",
    "gesture": "turn_while_holding:button_lfo",
    "short_label": "TEMP DELAY",
    "action": "On FX amounts, sets the selected track delay send, restoring it when LFO is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1893-1903",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1893-L1903"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "242-250",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L242-L250"
     }
    ]
   },
   {
    "mode": "temp_fx",
    "gesture": "turn_while_holding:button_lfo",
    "short_label": "TEMP TIME",
    "action": "On FX drive, sets delay time for the whole setup, restoring it when LFO is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1893-1903",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1893-L1903"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "242-250",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L242-L250"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "short_label": "TEACH KNOB",
    "action": "When prompted, records this encoder position and clockwise direction; settings are saved by the boot path or when Settings closes without a separate question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2013-2039",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2013-L2039"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "turn",
    "short_label": "WAKE",
    "action": "Wakes the screen without changing a value, with input swallowed until the encoder is quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "encoder_knob3": [
   {
    "mode": "wave",
    "gesture": "turn",
    "short_label": "SCROLL",
    "action": "Moves the waveform view without choosing another chop.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "233-240",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L233-L240"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "85-128",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L85-L128"
     }
    ]
   },
   {
    "mode": "kit",
    "gesture": "turn",
    "short_label": "CRUSH",
    "action": "Sets the drum track bit reduction.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "233-240",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L233-L240"
     }
    ]
   },
   {
    "mode": "fx1",
    "gesture": "turn",
    "short_label": "CHORUS SEND",
    "action": "Sets the selected track chorus send.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "242-250",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L242-L250"
     }
    ]
   },
   {
    "mode": "fx2",
    "gesture": "turn",
    "short_label": "FEEDBACK",
    "action": "Sets shared delay feedback from 0 to 120.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "242-250",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L242-L250"
     }
    ]
   },
   {
    "mode": "compressor",
    "gesture": "turn",
    "short_label": "ATTACK",
    "action": "Sets compressor attack from 1 to 100 ms.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "259-267",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L259-L267"
     }
    ]
   },
   {
    "mode": "makeup",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "259-267",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L259-L267"
     }
    ]
   },
   {
    "mode": "chops",
    "gesture": "turn",
    "short_label": "SPLIT / JOIN",
    "action": "Splits clockwise at the cursor or midpoint, or joins with the previous chop anticlockwise, changing key assignments without asking and allowing chop undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "251-258",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L251-L258"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "138-171",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L138-L171"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "219-226",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L219-L226"
     }
    ]
   },
   {
    "mode": "envelope",
    "gesture": "turn",
    "short_label": "TRIGGER",
    "action": "Chooses hold, one-shot or latch for this chop.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "169-169",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L169"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "chop_ops",
    "gesture": "turn",
    "short_label": "DUPE / SPLIT",
    "action": "Duplicates clockwise or splits anticlockwise without asking, inserting a chop when there is room and allowing chop undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "176-180",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L176-L180"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "148-178",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L148-L178"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "200-226",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L200-L226"
     }
    ]
   },
   {
    "mode": "key_assign",
    "gesture": "turn",
    "short_label": "SWAP",
    "action": "A clockwise turn swaps the two assignments without asking while stopped and silent, with chop undo available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "170-175",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L170-L175"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "188-198",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L188-L198"
     }
    ]
   },
   {
    "mode": "choke_layout",
    "gesture": "turn",
    "short_label": "SONG GAIN",
    "action": "Sets the selected song track level.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "161-167",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L161-L167"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "285-295",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L285-L295"
     }
    ]
   },
   {
    "mode": "grid",
    "gesture": "turn",
    "short_label": "GRID STEP",
    "action": "Chooses the sequence step while stopped.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "221-230",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L221-L230"
     }
    ]
   },
   {
    "mode": "roll",
    "gesture": "turn",
    "short_label": "ROLL STEP",
    "action": "Chooses the sequence step while stopped.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "221-230",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L221-L230"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "416-460",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L416-L460"
     }
    ]
   },
   {
    "mode": "step",
    "gesture": "turn",
    "short_label": "CHANCE",
    "action": "Sets step chance from 0 to 100 percent while stopped, with sequence undo available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "204-213",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L204-L213"
     }
    ]
   },
   {
    "mode": "step_pitch",
    "gesture": "turn",
    "short_label": "CONDITION",
    "action": "Chooses always, every second, every fourth, first pass or after first while stopped, with sequence undo available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "150-159",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L150-L159"
     }
    ]
   },
   {
    "mode": "timing",
    "gesture": "turn",
    "short_label": "TIMING TEMPO",
    "action": "Sets global tempo from 40 to 240 BPM.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "214-219",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L214-L219"
     }
    ]
   },
   {
    "mode": "record_prefs",
    "gesture": "turn",
    "short_label": "LIVE QUANT",
    "action": "Chooses live quantization off, sixteenth notes or eighth notes for this track.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "182-186",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L182-L186"
     }
    ]
   },
   {
    "mode": "tempo",
    "gesture": "turn",
    "short_label": "APPLY BPM",
    "action": "On a song, applies the selected chop tempo when it falls between 40 and 240 BPM, with no effect on Drums.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "134-139",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L134-L139"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "102-105",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L102-L105"
     }
    ]
   },
   {
    "mode": "speed_sync",
    "gesture": "turn",
    "short_label": "REFERENCE",
    "action": "Chooses the whole song clockwise or selected chop anticlockwise and recaptures its length.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "140-148",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L140-L148"
     }
    ]
   },
   {
    "mode": "pad",
    "gesture": "turn",
    "short_label": "PAD DECAY",
    "action": "Sets the selected pad decay from 0 to 127, with zero playing the complete hit.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "196-202",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L196-L202"
     }
    ]
   },
   {
    "mode": "rolls",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "168-168",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L168"
     }
    ]
   },
   {
    "mode": "mix_level",
    "gesture": "turn",
    "short_label": "LEVEL 3",
    "action": "Sets the Song 2 levels.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "3-9",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L9"
     }
    ]
   },
   {
    "mode": "mix_delay",
    "gesture": "turn",
    "short_label": "DELAY 3",
    "action": "Sets the Song 2 delay sends.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "3-9",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L9"
     }
    ]
   },
   {
    "mode": "mix_chorus",
    "gesture": "turn",
    "short_label": "CHORUS 3",
    "action": "Sets the Song 2 chorus sends.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "3-9",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L9"
     }
    ]
   },
   {
    "mode": "mix_reverb",
    "gesture": "turn",
    "short_label": "REVERB 3",
    "action": "Sets the Song 2 reverb sends.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "3-9",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L9"
     }
    ]
   },
   {
    "mode": "mute_solo",
    "gesture": "turn",
    "short_label": "MUTE SONG 2",
    "action": "Mutes Song 2 clockwise or unmutes it anticlockwise.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "325-328",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L325-L328"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "turn",
    "short_label": "CHAIN EDIT",
    "action": "Adds the selected phrase to the arrangement clockwise or removes its last section anticlockwise while stopped, without asking or a dedicated arrangement undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "130-155",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L130-L155"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "87-110",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L87-L110"
     }
    ]
   },
   {
    "mode": "arrangement",
    "gesture": "turn",
    "short_label": "SECTION REPS",
    "action": "Sets section repeats from 1 to 16 while stopped.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "112-129",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L112-L129"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "156-164",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L156-L164"
     }
    ]
   },
   {
    "mode": "arr_tools",
    "gesture": "turn",
    "short_label": "DUPE SECTION",
    "action": "Duplicates the selected section clockwise while stopped if fewer than sixteen sections exist, without asking or a dedicated arrangement undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "130-145",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L130-L145"
     }
    ]
   },
   {
    "mode": "variations",
    "gesture": "turn",
    "short_label": "CLEAR LOCKS",
    "action": "A turn in either direction clears all step locks of this track immediately in memory while stopped and silent without asking, with sequence undo available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "188-195",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L188-L195"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "87-110",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L87-L110"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes the selected valued setting, applied immediately and saved on closing Settings; action-only rows do nothing on a turn.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-567",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L567"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "248-310",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L248-L310"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes the selected valued setting, applied immediately and saved on closing Settings; action-only rows do nothing on a turn.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-567",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L567"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "248-310",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L248-L310"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes the selected audio setting immediately, with TUNE kept by project save or autosave and the other audio preferences saved when Settings closes.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "247-251",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L247-L251"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "287-290",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L287-L290"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/settings_persist.c",
      "lines": "89-100",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/settings_persist.c#L89-L100"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes MIDI IN routing immediately, kept by project save or autosave rather than closing Settings, while LEARN CLEAR does nothing on a turn.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "247-251",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L247-L251"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "289-290",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L289-L290"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/settings_persist.c",
      "lines": "89-100",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/settings_persist.c#L89-L100"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes the selected valued setting, applied immediately and saved on closing Settings; action-only rows do nothing on a turn.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-567",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L567"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "248-310",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L248-L310"
     }
    ]
   },
   {
    "mode": "glo_layer",
    "gesture": "turn_while_holding:button_glo",
    "short_label": "LEVEL 3",
    "action": "Sets the Song 2 level and can select it for MIDI LEARN.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "498-507",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L498-L507"
     }
    ]
   },
   {
    "mode": "seq_layer",
    "gesture": "turn_while_holding:button_seq",
    "short_label": "TOOLS SWING",
    "action": "Sets track swing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "28-30",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L28-L30"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "519-527",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L519-L527"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "967-968",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L967-L968"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1057-1065",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1057-L1065"
     }
    ]
   },
   {
    "mode": "temp_fx",
    "gesture": "turn_while_holding:button_lfo",
    "short_label": "TEMP CHORUS",
    "action": "On FX amounts, sets the selected track chorus send, restoring it when LFO is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1893-1903",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1893-L1903"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "242-250",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L242-L250"
     }
    ]
   },
   {
    "mode": "temp_fx",
    "gesture": "turn_while_holding:button_lfo",
    "short_label": "TEMP FEEDBK",
    "action": "On FX drive, sets shared delay feedback from 0 to 120, restoring it when LFO is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1893-1903",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1893-L1903"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "242-250",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L242-L250"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "short_label": "TEACH KNOB",
    "action": "When prompted, records this encoder position and clockwise direction; settings are saved by the boot path or when Settings closes without a separate question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2013-2039",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2013-L2039"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "turn",
    "short_label": "WAKE",
    "action": "Wakes the screen without changing a value, with input swallowed until the encoder is quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "encoder_knob4": [
   {
    "mode": "wave",
    "gesture": "turn",
    "short_label": "ZOOM",
    "action": "Changes horizontal zoom through seven levels.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "233-240",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L233-L240"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "85-128",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L85-L128"
     }
    ]
   },
   {
    "mode": "kit",
    "gesture": "turn",
    "short_label": "TONE",
    "action": "Sets the drum track tone filter.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "233-240",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L233-L240"
     }
    ]
   },
   {
    "mode": "fx1",
    "gesture": "turn",
    "short_label": "REVERB SEND",
    "action": "Sets the selected track reverb send.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "242-250",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L242-L250"
     }
    ]
   },
   {
    "mode": "fx2",
    "gesture": "turn",
    "short_label": "TRACK LEVEL",
    "action": "Sets the selected track level.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "242-250",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L242-L250"
     }
    ]
   },
   {
    "mode": "compressor",
    "gesture": "turn",
    "short_label": "RELEASE",
    "action": "Sets compressor release from 10 to 500 ms.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "259-267",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L259-L267"
     }
    ]
   },
   {
    "mode": "makeup",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "259-267",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L259-L267"
     }
    ]
   },
   {
    "mode": "chops",
    "gesture": "turn",
    "short_label": "CHOP UNDO",
    "action": "Swaps the last chop-table edit with its redo copy in either direction, without undoing a sample transfer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "251-258",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L251-L258"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "138-171",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L138-L171"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "219-226",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L219-L226"
     }
    ]
   },
   {
    "mode": "envelope",
    "gesture": "turn",
    "short_label": "CHOP LOOP",
    "action": "Enables the chop loop clockwise or disables it anticlockwise.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "169-169",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L169"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "chop_ops",
    "gesture": "turn",
    "short_label": "SET / MERGE",
    "action": "Copies pitch and playback settings from the source clockwise or joins the preceding chop anticlockwise, without asking and allowing chop undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "176-180",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L176-L180"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "148-178",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L148-L178"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "200-226",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L200-L226"
     }
    ]
   },
   {
    "mode": "key_assign",
    "gesture": "turn",
    "short_label": "MOVE",
    "action": "A clockwise turn moves the assignment and shifts intervening keys without asking while stopped and silent, with chop undo available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "170-175",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L170-L175"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "188-198",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L188-L198"
     }
    ]
   },
   {
    "mode": "choke_layout",
    "gesture": "turn",
    "short_label": "COPY LAYOUT",
    "action": "A clockwise turn overwrites the alternate chop layout from the current one without asking while stopped and silent, with no chop-table undo for this copy.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "161-167",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L161-L167"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "285-295",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L285-L295"
     }
    ]
   },
   {
    "mode": "grid",
    "gesture": "turn",
    "short_label": "GRID LENGTH",
    "action": "Sets sequence length from 1 to 64 while stopped, preserving later hidden notes and allowing sequence undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "221-230",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L221-L230"
     }
    ]
   },
   {
    "mode": "roll",
    "gesture": "turn",
    "short_label": "ROLL LENGTH",
    "action": "Sets sequence length from 1 to 64 while stopped, preserving later hidden notes and allowing sequence undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "221-230",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L221-L230"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "416-460",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L416-L460"
     }
    ]
   },
   {
    "mode": "step",
    "gesture": "turn",
    "short_label": "REPEATS",
    "action": "Sets one to four repeats while stopped, with sequence undo available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "204-213",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L204-L213"
     }
    ]
   },
   {
    "mode": "step_pitch",
    "gesture": "turn",
    "short_label": "PITCH STEP",
    "action": "Chooses the step while stopped.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "150-159",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L150-L159"
     }
    ]
   },
   {
    "mode": "timing",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "214-219",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L214-L219"
     }
    ]
   },
   {
    "mode": "record_prefs",
    "gesture": "turn",
    "short_label": "SONG CHOKE",
    "action": "Enables song choke clockwise or disables it anticlockwise on a song, with no effect on Drums.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "182-186",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L182-L186"
     }
    ]
   },
   {
    "mode": "tempo",
    "gesture": "turn",
    "short_label": "TEMPO CHOP",
    "action": "On a song, chooses the chop used for the tempo calculation.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "134-139",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L134-L139"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "102-105",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L102-L105"
     }
    ]
   },
   {
    "mode": "speed_sync",
    "gesture": "turn",
    "short_label": "SYNC CHOP",
    "action": "Chooses a chop and recaptures the sync reference length.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "140-148",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L140-L148"
     }
    ]
   },
   {
    "mode": "pad",
    "gesture": "turn",
    "short_label": "PAD CHOKE",
    "action": "Sets the selected pad choke group from 0 to 4, with zero disabling choke.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "196-202",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L196-L202"
     }
    ]
   },
   {
    "mode": "rolls",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "168-168",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L168"
     }
    ]
   },
   {
    "mode": "mix_level",
    "gesture": "turn",
    "short_label": "TRACK PAN",
    "action": "Sets selected-track pan.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "3-9",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L9"
     }
    ]
   },
   {
    "mode": "mix_delay",
    "gesture": "turn",
    "short_label": "TRACK PAN",
    "action": "Sets selected-track pan.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "3-9",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L9"
     }
    ]
   },
   {
    "mode": "mix_chorus",
    "gesture": "turn",
    "short_label": "TRACK PAN",
    "action": "Sets selected-track pan.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "3-9",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L9"
     }
    ]
   },
   {
    "mode": "mix_reverb",
    "gesture": "turn",
    "short_label": "TRACK PAN",
    "action": "Sets selected-track pan.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange_ui.c",
      "lines": "3-9",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange_ui.c#L3-L9"
     }
    ]
   },
   {
    "mode": "mute_solo",
    "gesture": "turn",
    "short_label": "SOLO",
    "action": "Chooses no solo, Song 1, kit or Song 2.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "325-328",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L325-L328"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "turn",
    "short_label": "PASTE / COPY",
    "action": "Pastes clockwise into the current phrase and saves it to the selected A–D slot at once while stopped and silent without asking or flash undo, or copies the current phrase anticlockwise.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "130-155",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L130-L155"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "87-110",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L87-L110"
     }
    ]
   },
   {
    "mode": "arrangement",
    "gesture": "turn",
    "short_label": "INSERT / DEL",
    "action": "Inserts the selected phrase after this section clockwise or deletes this section anticlockwise while stopped, without asking or a dedicated arrangement undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "112-129",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L112-L129"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "156-164",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L156-L164"
     }
    ]
   },
   {
    "mode": "arr_tools",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing despite the section display.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "130-145",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L130-L145"
     }
    ]
   },
   {
    "mode": "variations",
    "gesture": "turn",
    "short_label": "DUPLICATE",
    "action": "A clockwise turn copies the phrase to the destination and saves it there immediately while stopped and silent without asking or flash undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "188-195",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L188-L195"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "87-110",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L87-L110"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes the selected valued setting, applied immediately and saved on closing Settings; action-only rows do nothing on a turn.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-567",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L567"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "248-310",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L248-L310"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes the selected valued setting, applied immediately and saved on closing Settings; action-only rows do nothing on a turn.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-567",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L567"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "248-310",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L248-L310"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes the selected audio setting immediately, with TUNE kept by project save or autosave and the other audio preferences saved when Settings closes.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "247-251",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L247-L251"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "287-290",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L287-L290"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/settings_persist.c",
      "lines": "89-100",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/settings_persist.c#L89-L100"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes MIDI IN routing immediately, kept by project save or autosave rather than closing Settings, while LEARN CLEAR does nothing on a turn.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "247-251",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L247-L251"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "289-290",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L289-L290"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/settings_persist.c",
      "lines": "89-100",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/settings_persist.c#L89-L100"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "turn",
    "short_label": "SETTING",
    "action": "Changes the selected valued setting, applied immediately and saved on closing Settings; action-only rows do nothing on a turn.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-567",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L567"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "248-310",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L248-L310"
     }
    ]
   },
   {
    "mode": "glo_layer",
    "gesture": "turn_while_holding:button_glo",
    "short_label": "-",
    "action": "Does nothing because only three tracks are available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "498-503",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L498-L503"
     }
    ]
   },
   {
    "mode": "seq_layer",
    "gesture": "turn_while_holding:button_seq",
    "short_label": "TOOLS GATE",
    "action": "Sets track default gate.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "28-30",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L28-L30"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "519-527",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L519-L527"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "967-968",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L967-L968"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1057-1065",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1057-L1065"
     }
    ]
   },
   {
    "mode": "temp_fx",
    "gesture": "turn_while_holding:button_lfo",
    "short_label": "TEMP REVERB",
    "action": "On FX amounts, sets the selected track reverb send, restoring it when LFO is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1893-1903",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1893-L1903"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "242-250",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L242-L250"
     }
    ]
   },
   {
    "mode": "temp_fx",
    "gesture": "turn_while_holding:button_lfo",
    "short_label": "TEMP LEVEL",
    "action": "On FX drive, sets the selected track level, restoring it when LFO is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1893-1903",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1893-L1903"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "242-250",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L242-L250"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "short_label": "TEACH KNOB",
    "action": "When prompted, records this encoder position and clockwise direction; settings are saved by the boot path or when Settings closes without a separate question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2013-2039",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2013-L2039"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "turn",
    "short_label": "WAKE",
    "action": "Wakes the screen without changing a value, with input swallowed until the encoder is quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "button_fx": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "FX",
    "action": "Opens FX amounts, except on pages with a specific FX navigation action.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1386-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1386-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "681-688",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L681-L688"
     }
    ]
   },
   {
    "mode": "fx1",
    "gesture": "press",
    "short_label": "FX DRIVE",
    "action": "Opens FX drive.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1386-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1386-L1389"
     }
    ]
   },
   {
    "mode": "fx2",
    "gesture": "press",
    "short_label": "FX AMOUNTS",
    "action": "Opens FX amounts.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1386-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1386-L1389"
     }
    ]
   },
   {
    "mode": "chop_ops",
    "gesture": "press",
    "short_label": "CHOKE PAGE",
    "action": "Opens Choke layout.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "choke_layout",
    "gesture": "press",
    "short_label": "CHOP TOOLS",
    "action": "Opens Copy and split.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "tempo",
    "gesture": "press",
    "short_label": "SPEED SYNC",
    "action": "Opens Speed sync on a song; on Drums it opens FX amounts.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "speed_sync",
    "gesture": "press",
    "short_label": "TEMPO TOOLS",
    "action": "Opens Tempo tools.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "TEACH BUTTON",
    "action": "When prompted for this control, records its physical position in the calibration mapping.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1996-2010",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1996-L2010"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without performing the usual button action, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "COMPRESSOR",
    "action": "Opens compressor dynamics, except on pages with a specific ENV navigation action.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1386-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1386-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "681-688",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L681-L688"
     }
    ]
   },
   {
    "mode": "kit",
    "gesture": "press",
    "short_label": "PAD SETTINGS",
    "action": "Opens Drum pad.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1370-1370",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1370"
     }
    ]
   },
   {
    "mode": "pad",
    "gesture": "press",
    "short_label": "KIT HOME",
    "action": "Returns to the kit page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1370-1370",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1370"
     }
    ]
   },
   {
    "mode": "chops",
    "gesture": "press",
    "short_label": "ENVELOPE",
    "action": "Opens Chop envelope.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "envelope",
    "gesture": "press",
    "short_label": "CHOP PLAY",
    "action": "Opens Chop playback.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "chop_ops",
    "gesture": "press",
    "short_label": "KEY ASSIGN",
    "action": "Opens Swap and move.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "key_assign",
    "gesture": "press",
    "short_label": "CHOP TOOLS",
    "action": "Opens Copy and split.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "grid",
    "gesture": "press",
    "short_label": "STEP DETAILS",
    "action": "Opens Step dynamics.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "roll",
    "gesture": "press",
    "short_label": "STEP DETAILS",
    "action": "Opens Step dynamics.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "timing",
    "gesture": "press",
    "short_label": "STEP DETAILS",
    "action": "Opens Step dynamics.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "step",
    "gesture": "press",
    "short_label": "STEP PITCH",
    "action": "Opens Step pitch.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "step_pitch",
    "gesture": "press",
    "short_label": "STEP DETAILS",
    "action": "Opens Step dynamics.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "record_prefs",
    "gesture": "press",
    "short_label": "TEMPO TOOLS",
    "action": "Opens Tempo tools.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "tempo",
    "gesture": "press",
    "short_label": "REC PREFS",
    "action": "Opens Recording.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "press",
    "short_label": "LAUNCH TOOLS",
    "action": "Opens Launch tools.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "arrangement",
    "gesture": "press",
    "short_label": "LAUNCH TOOLS",
    "action": "Opens Launch tools.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "arr_tools",
    "gesture": "press",
    "short_label": "VARIATIONS",
    "action": "Opens Variations.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "variations",
    "gesture": "press",
    "short_label": "LAUNCH TOOLS",
    "action": "Opens Launch tools.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "compressor",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing on this page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1386-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1386-L1389"
     }
    ]
   },
   {
    "mode": "makeup",
    "gesture": "press",
    "short_label": "DYNAMICS",
    "action": "Opens compressor dynamics.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1386-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1386-L1389"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "TEACH BUTTON",
    "action": "When prompted for this control, records its physical position in the calibration mapping.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1996-2010",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1996-L2010"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without performing the usual button action, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "MAKEUP PAGE",
    "action": "Opens compressor makeup, except on pages with a specific LFO navigation action.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1386-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1386-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "681-688",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L681-L688"
     }
    ]
   },
   {
    "mode": "chop_ops",
    "gesture": "press",
    "short_label": "CHOP PLAY",
    "action": "Opens Chop playback.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "chops",
    "gesture": "press",
    "short_label": "CHOP TOOLS",
    "action": "Opens Copy and split.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "envelope",
    "gesture": "press",
    "short_label": "CHOP TOOLS",
    "action": "Opens Copy and split.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "pad",
    "gesture": "press",
    "short_label": "DRUM ROLLS",
    "action": "Opens Drum rolls.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "rolls",
    "gesture": "press",
    "short_label": "DRUM PAD",
    "action": "Opens Drum pad.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "grid",
    "gesture": "press",
    "short_label": "TIMING",
    "action": "Opens Timing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "roll",
    "gesture": "press",
    "short_label": "TIMING",
    "action": "Opens Timing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "step",
    "gesture": "press",
    "short_label": "TIMING",
    "action": "Opens Timing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "timing",
    "gesture": "press",
    "short_label": "REC PREFS",
    "action": "Opens Recording.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "record_prefs",
    "gesture": "press",
    "short_label": "TIMING",
    "action": "Opens Timing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1352-1373",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1373"
     }
    ]
   },
   {
    "mode": "compressor",
    "gesture": "press",
    "short_label": "MAKEUP PAGE",
    "action": "Opens compressor makeup.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1386-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1386-L1389"
     }
    ]
   },
   {
    "mode": "makeup",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing on this page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1386-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1386-L1389"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "temp_fx",
    "gesture": "release",
    "short_label": "RESTORE FX",
    "action": "Restores captured FX values on release unless OCT+ kept them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1516-1518",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1516-L1518"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "TEACH BUTTON",
    "action": "When prompted for this control, records its physical position in the calibration mapping.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1996-2010",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1996-L2010"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without performing the usual button action, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "WAVEFORM",
    "action": "Returns to the waveform or kit page, except on pages with a specific EDIT action.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1386-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1386-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "681-688",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L681-L688"
     }
    ]
   },
   {
    "mode": "wave",
    "gesture": "press",
    "short_label": "CHOP PAGE",
    "action": "Opens Chop playback.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1386-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1386-L1389"
     }
    ]
   },
   {
    "mode": "kit",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing on this page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1386-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1386-L1389"
     }
    ]
   },
   {
    "mode": "fx1",
    "gesture": "press",
    "short_label": "RESET FX",
    "action": "Immediately clears this track delay, chorus, reverb and drive amounts and opens its filter fully without asking or a dedicated reset undo, leaving shared delay controls and compression unchanged.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1368",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1368"
     }
    ]
   },
   {
    "mode": "fx2",
    "gesture": "press",
    "short_label": "RESET FX",
    "action": "Immediately clears this track delay, chorus, reverb and drive amounts and opens its filter fully without asking or a dedicated reset undo, leaving shared delay controls and compression unchanged.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1368",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1368"
     }
    ]
   },
   {
    "mode": "grid",
    "gesture": "press",
    "short_label": "REST / NEXT",
    "action": "Clears the selected step and its locks immediately in memory while stopped without asking, then advances one step, with sequence undo available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1374-1379",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1374-L1379"
     }
    ]
   },
   {
    "mode": "roll",
    "gesture": "press",
    "short_label": "REST / NEXT",
    "action": "Clears the selected step and its locks immediately in memory while stopped without asking, then advances one step, with sequence undo available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1374-1379",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1374-L1379"
     }
    ]
   },
   {
    "mode": "tempo",
    "gesture": "press",
    "short_label": "TAP TEMPO",
    "action": "Sets 40–240 BPM from repeated taps using up to four recent intervals.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1353-1353",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1353"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "92-100",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L92-L100"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "TEACH BUTTON",
    "action": "When prompted for this control, records its physical position in the calibration mapping.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1996-2010",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1996-L2010"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without performing the usual button action, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "TEMPO PAGE",
    "action": "Opens Tempo tools on press.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1420-1423",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1420-L1423"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "681-688",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L681-L688"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "short_label": "MIX SHORTCUT",
    "action": "After the selected 0.3–0.6-second HOLD delay, shows mixer shortcuts, with the first opening saving its seen-state without asking, deferred during playback.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1534-1542",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1534-L1542"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "167-174",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L167-L174"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "197-215",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L215"
     }
    ]
   },
   {
    "mode": "glo_layer",
    "gesture": "release",
    "short_label": "CLOSE LAYER",
    "action": "Closes the held overlay on release and keeps its edits without another page jump.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1685-1689",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1685-L1689"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "197-225",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L225"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "TEACH BUTTON",
    "action": "When prompted for this control, records its physical position in the calibration mapping.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1996-2010",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1996-L2010"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without performing the usual button action, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "SEQUENCE",
    "action": "Opens the selected track sequence grid, or alternates grid and piano roll when already on the sequence page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1344-1350",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1344-L1350"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "681-688",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L681-L688"
     }
    ]
   },
   {
    "mode": "grid",
    "gesture": "press",
    "short_label": "PIANO ROLL",
    "action": "Switches to the piano roll.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1344-1350",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1344-L1350"
     }
    ]
   },
   {
    "mode": "roll",
    "gesture": "press",
    "short_label": "STEP GRID",
    "action": "Switches to the grid.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1344-1350",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1344-L1350"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "short_label": "SEQ TOOLS",
    "action": "After the selected 0.3–0.6-second HOLD delay, shows sequence tools, with the first opening saving its seen-state without asking, deferred during playback.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1534-1542",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1534-L1542"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "167-174",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L167-L174"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "197-215",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L215"
     }
    ]
   },
   {
    "mode": "seq_layer",
    "gesture": "release",
    "short_label": "CLOSE LAYER",
    "action": "Closes the held overlay on release and keeps its edits without another page jump.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1685-1689",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1685-L1689"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "197-225",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L225"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "TEACH BUTTON",
    "action": "When prompted for this control, records its physical position in the calibration mapping.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1996-2010",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1996-L2010"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without performing the usual button action, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "PATTERNS",
    "action": "Opens Patterns, except that SEL cycles Patterns to Arrangement to waveform.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1381-1383",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1381-L1383"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "681-688",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L681-L688"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "press",
    "short_label": "ARRANGEMENT",
    "action": "Opens Arrangement.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1381-1383",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1381-L1383"
     }
    ]
   },
   {
    "mode": "arrangement",
    "gesture": "press",
    "short_label": "SONG HOME",
    "action": "Returns to the waveform or kit page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1381-1383",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1381-L1383"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "TEACH BUTTON",
    "action": "When prompted for this control, records its physical position in the calibration mapping.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1996-2010",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1996-L2010"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without performing the usual button action, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "MIXER",
    "action": "Cycles levels, mute/solo, delay, chorus, reverb and waveform.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1385-1385",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1385"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "681-688",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L681-L688"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "TEACH BUTTON",
    "action": "When prompted for this control, records its physical position in the calibration mapping.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1996-2010",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1996-L2010"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without performing the usual button action, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "button_home": [
   {
    "mode": "wave",
    "gesture": "press",
    "short_label": "SETTINGS",
    "action": "Opens Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1525-1527",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1525-L1527"
     }
    ]
   },
   {
    "mode": "kit",
    "gesture": "press",
    "short_label": "SETTINGS",
    "action": "Opens Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1525-1527",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1525-L1527"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "HOME",
    "action": "Returns to the waveform or kit page from another sampler page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1690-1691",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1690-L1691"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "726-736",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L726-L736"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "press",
    "short_label": "CLOSE / SAVE",
    "action": "Closes Settings and saves changed settings without asking or undo, deferred during playback, even when only calibration or a first menu visit changed the stored state.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1593-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1593-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "press",
    "short_label": "CLOSE / SAVE",
    "action": "Closes Settings and saves changed settings without asking or undo, deferred during playback, even when only calibration or a first menu visit changed the stored state.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1593-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1593-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "press",
    "short_label": "CLOSE / SAVE",
    "action": "Closes Settings and saves changed settings without asking or undo, deferred during playback, even when only calibration or a first menu visit changed the stored state.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1593-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1593-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "press",
    "short_label": "CLOSE / SAVE",
    "action": "Closes Settings and saves changed settings without asking or undo, deferred during playback, even when only calibration or a first menu visit changed the stored state.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1593-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1593-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "press",
    "short_label": "CLOSE / SAVE",
    "action": "Closes Settings and saves changed settings without asking or undo, deferred during playback, even when only calibration or a first menu visit changed the stored state.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1593-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1593-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "press",
    "short_label": "CLOSE / SAVE",
    "action": "Closes Settings and saves changed settings without asking or undo, deferred during playback.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1593-1595",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1593-L1595"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "press",
    "short_label": "CLOSE / SAVE",
    "action": "Closes Settings and saves changed settings without asking or undo, deferred during playback.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1593-1595",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1593-L1595"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "TEACH BUTTON",
    "action": "When prompted for this control, records its physical position in the calibration mapping.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1996-2010",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1996-L2010"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without performing the usual button action, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "SAVE PHRASE",
    "action": "While stopped and silent, immediately overwrites the selected A–D phrase with the project without asking or flash undo, before either a tap release or hold is recognized.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1693-1698",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1693-L1698"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "98-104",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L98-L104"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "SAVE PAGE",
    "action": "After a short SAVE press, opens Patterns on release without another flash write.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1631-1632",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1631-L1632"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "681-688",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L681-L688"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "short_label": "SEQ UNDO",
    "action": "After more than 0.7 seconds, swaps the last available track edit or load with its undo copy unless an arrangement is active, after the initial press already attempted to save the phrase.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1627-1630",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1627-L1630"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1300-1317",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1300-L1317"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "988-1040",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L988-L1040"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "TEACH BUTTON",
    "action": "When prompted for this control, records its physical position in the calibration mapping.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1996-2010",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1996-L2010"
     }
    ]
   },
   {
    "mode": "glo_layer",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while the shortcut layer owns the held input.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1559-1564",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1559-L1564"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1627-1632",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1627-L1632"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1693-1698",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1693-L1698"
     }
    ]
   },
   {
    "mode": "glo_layer",
    "gesture": "long_press",
    "short_label": "-",
    "action": "Does nothing while the shortcut layer owns the held input.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1559-1564",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1559-L1564"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1627-1632",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1627-L1632"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1693-1698",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1693-L1698"
     }
    ]
   },
   {
    "mode": "seq_layer",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while the shortcut layer owns the held input.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1559-1564",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1559-L1564"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1627-1632",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1627-L1632"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1693-1698",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1693-L1698"
     }
    ]
   },
   {
    "mode": "seq_layer",
    "gesture": "long_press",
    "short_label": "-",
    "action": "Does nothing while the shortcut layer owns the held input.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1559-1564",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1559-L1564"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1627-1632",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1627-L1632"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1693-1698",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1693-L1698"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without performing the usual button action, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "-",
    "action": "A REC tap alone has no effect because the retired recording layer swallows its release.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "95-107",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1303-1317",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1303-L1317"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "197-205",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L205"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1685-1689",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1685-L1689"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1741-1744",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1741-L1744"
     }
    ]
   },
   {
    "mode": "grid",
    "gesture": "release",
    "short_label": "-",
    "action": "A REC tap alone has no effect because the retired recording layer swallows its release.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "95-107",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1303-1317",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1303-L1317"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "197-205",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L205"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1685-1689",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1685-L1689"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1741-1744",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1741-L1744"
     }
    ]
   },
   {
    "mode": "roll",
    "gesture": "release",
    "short_label": "-",
    "action": "A REC tap alone has no effect because the retired recording layer swallows its release.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "95-107",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1303-1317",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1303-L1317"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "197-205",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L205"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1685-1689",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1685-L1689"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1741-1744",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1741-L1744"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "release",
    "short_label": "-",
    "action": "A REC tap alone has no effect because the retired recording layer swallows its release.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "95-107",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1303-1317",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1303-L1317"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "197-205",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L205"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1685-1689",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1685-L1689"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1741-1744",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1741-L1744"
     }
    ]
   },
   {
    "mode": "arrangement",
    "gesture": "release",
    "short_label": "-",
    "action": "A REC tap alone has no effect because the retired recording layer swallows its release.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "95-107",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1303-1317",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1303-L1317"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "197-205",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L205"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1685-1689",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1685-L1689"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1741-1744",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1741-L1744"
     }
    ]
   },
   {
    "mode": "arr_tools",
    "gesture": "release",
    "short_label": "-",
    "action": "A REC tap alone has no effect because the retired recording layer swallows its release.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "95-107",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1303-1317",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1303-L1317"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "197-205",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L205"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1685-1689",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1685-L1689"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1741-1744",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1741-L1744"
     }
    ]
   },
   {
    "mode": "variations",
    "gesture": "release",
    "short_label": "-",
    "action": "A REC tap alone has no effect because the retired recording layer swallows its release.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "95-107",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1303-1317",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1303-L1317"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "197-205",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L205"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1685-1689",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1685-L1689"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1741-1744",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1741-L1744"
     }
    ]
   },
   {
    "mode": "chop_ops",
    "gesture": "release",
    "short_label": "-",
    "action": "A REC tap alone has no effect because the retired recording layer swallows its release.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "95-107",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1303-1317",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1303-L1317"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "197-205",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L205"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1685-1689",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1685-L1689"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1741-1744",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1741-L1744"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "TEACH BUTTON",
    "action": "When prompted for this control, records its physical position in the calibration mapping.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1996-2010",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1996-L2010"
     }
    ]
   },
   {
    "mode": "rec_access",
    "gesture": "press_while_holding:button_fx",
    "short_label": "ARM / LIVE",
    "action": "A tap released while FX remains held toggles recording, staying stopped on the grid or roll but starting transport when arming on other ordinary playing pages.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-24",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L12-L24"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "95-107",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1607-1608",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1607-L1608"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "595-631",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L595-L631"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "press_while_holding:button_fx",
    "short_label": "SAVE VIA FX",
    "action": "With FX already held before navigating here, a REC tap released while FX remains down immediately overwrites the selected A–D project while stopped and silent without asking or flash undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "95-107",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1607-1608",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1607-L1608"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "604",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L604"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "98-104",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L98-L104"
     }
    ]
   },
   {
    "mode": "arrangement",
    "gesture": "press_while_holding:button_fx",
    "short_label": "SAVE VIA FX",
    "action": "With FX already held before navigating here, a REC tap released while FX remains down immediately overwrites the selected A–D project while stopped and silent without asking or flash undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "95-107",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1607-1608",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1607-L1608"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "604",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L604"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "98-104",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L98-L104"
     }
    ]
   },
   {
    "mode": "arr_tools",
    "gesture": "press_while_holding:button_fx",
    "short_label": "SAVE VIA FX",
    "action": "With FX already held before navigating here, a REC tap released while FX remains down immediately overwrites the selected A–D project while stopped and silent without asking or flash undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "95-107",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1607-1608",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1607-L1608"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "604",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L604"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "98-104",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L98-L104"
     }
    ]
   },
   {
    "mode": "variations",
    "gesture": "press_while_holding:button_fx",
    "short_label": "SAVE VIA FX",
    "action": "With FX already held before navigating here, a REC tap released while FX remains down immediately overwrites the selected A–D project while stopped and silent without asking or flash undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "95-107",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1607-1608",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1607-L1608"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "604",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L604"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "98-104",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L98-L104"
     }
    ]
   },
   {
    "mode": "chop_ops",
    "gesture": "press_while_holding:button_fx",
    "short_label": "COPY VIA FX",
    "action": "Hold FX, return HOME, open EDIT then LFO, and tap and release REC before releasing FX to overwrite the target with the source complete chop while stopped and silent without asking, with chop undo available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "95-107",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1607-1608",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1607-L1608"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "599-602",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L599-L602"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "180-186",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L180-L186"
     }
    ]
   },
   {
    "mode": "glo_layer",
    "gesture": "press_while_holding:button_glo",
    "short_label": "LIVE ARM",
    "action": "A REC tap released while this shortcut remains held toggles recording and starts transport if arming while stopped because the shortcut overlay bypasses stopped-grid entry.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1607-1608",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1607-L1608"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "595-626",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L595-L626"
     }
    ]
   },
   {
    "mode": "seq_layer",
    "gesture": "press_while_holding:button_seq",
    "short_label": "LIVE ARM",
    "action": "A REC tap released while this shortcut remains held toggles recording and starts transport if arming while stopped because the shortcut overlay bypasses stopped-grid entry.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1531-1536",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1607-1608",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1607-L1608"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "595-626",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L595-L626"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without performing the usual button action, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "PLAY / STOP",
    "action": "Starts transport or stops playback and count-in, clearing step-entry arming for enabled sampler tracks when starting from a stopped sampler page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1701-1723",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1701-L1723"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "press",
    "short_label": "LOOP PHRASE",
    "action": "Starts the selected saved phrase looping, or stops playback if already running, refusing an empty phrase.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1701-1711",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1701-L1711"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "175-182",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L175-L182"
     }
    ]
   },
   {
    "mode": "arrangement",
    "gesture": "press",
    "short_label": "PLAY ARRANGE",
    "action": "Starts the section arrangement, or stops playback if already running.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1701-1711",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1701-L1711"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "175-178",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L175-L178"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in Settings.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     }
    ]
   },
   {
    "mode": "glo_layer",
    "gesture": "press_while_holding:button_glo",
    "short_label": "RESTART",
    "action": "With GLO held, restarts internal playback from the top or starts when stopped, refusing a running external-clock restart.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1708-1711",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1708-L1711"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "531-542",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L531-L542"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "TEACH BUTTON",
    "action": "When prompted for this control, records its physical position in the calibration mapping.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1996-2010",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1996-L2010"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without performing the usual button action, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing on sampler pages except the song pitch, grid duration, Patterns clipboard and held-layer cases listed separately.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1745-1758",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1745-L1758"
     }
    ]
   },
   {
    "mode": "wave",
    "gesture": "press",
    "short_label": "PITCH −",
    "action": "On a song, moves selected chop pitch down one semitone within ±24, with chop undo available; on Drums it does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1755-1756",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1755-L1756"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "130-136",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L130-L136"
     }
    ]
   },
   {
    "mode": "fx1",
    "gesture": "press",
    "short_label": "PITCH −",
    "action": "On a song, moves selected chop pitch down one semitone within ±24, with chop undo available; on Drums it does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1755-1756",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1755-L1756"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "130-136",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L130-L136"
     }
    ]
   },
   {
    "mode": "fx2",
    "gesture": "press",
    "short_label": "PITCH −",
    "action": "On a song, moves selected chop pitch down one semitone within ±24, with chop undo available; on Drums it does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1755-1756",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1755-L1756"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "130-136",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L130-L136"
     }
    ]
   },
   {
    "mode": "compressor",
    "gesture": "press",
    "short_label": "PITCH −",
    "action": "On a song, moves selected chop pitch down one semitone within ±24, with chop undo available; on Drums it does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1755-1756",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1755-L1756"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "130-136",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L130-L136"
     }
    ]
   },
   {
    "mode": "makeup",
    "gesture": "press",
    "short_label": "PITCH −",
    "action": "On a song, moves selected chop pitch down one semitone within ±24, with chop undo available; on Drums it does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1755-1756",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1755-L1756"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "130-136",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L130-L136"
     }
    ]
   },
   {
    "mode": "chops",
    "gesture": "press",
    "short_label": "PITCH −",
    "action": "On a song, moves selected chop pitch down one semitone within ±24, with chop undo available; on Drums it does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1755-1756",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1755-L1756"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "130-136",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L130-L136"
     }
    ]
   },
   {
    "mode": "mute_solo",
    "gesture": "press",
    "short_label": "PITCH −",
    "action": "On a song, moves selected chop pitch down one semitone within ±24, with chop undo available; on Drums it does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1755-1756",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1755-L1756"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "130-136",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L130-L136"
     }
    ]
   },
   {
    "mode": "grid",
    "gesture": "press",
    "short_label": "STEP SLOWER",
    "action": "Moves to the next longer sequencer step duration.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1751-1753",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1751-L1753"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/params.c",
      "lines": "276-305",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/params.c#L276-L305"
     }
    ]
   },
   {
    "mode": "roll",
    "gesture": "press",
    "short_label": "STEP SLOWER",
    "action": "Moves to the next longer sequencer step duration.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1751-1753",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1751-L1753"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/params.c",
      "lines": "276-305",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/params.c#L276-L305"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "press",
    "short_label": "COPY PHRASE",
    "action": "Copies the current phrase to the clipboard while stopped without writing flash.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1750-1750",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1750"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "87-110",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L87-L110"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "release",
    "short_label": "SETTING −",
    "action": "On release, steps to the previous value, with no action on action-only rows.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-566",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L566"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "release",
    "short_label": "SETTING −",
    "action": "On release, steps to the previous value, with no action on action-only rows.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-566",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L566"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "release",
    "short_label": "SETTING −",
    "action": "On release, steps to the previous value, with no action on action-only rows.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-566",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L566"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "release",
    "short_label": "SETTING −",
    "action": "On release, steps to the previous value, with no action on action-only rows.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-566",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L566"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "release",
    "short_label": "SETTING −",
    "action": "On release, steps to the previous value, with no action on action-only rows.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "559-566",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L559-L566"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "release",
    "short_label": "BACK",
    "action": "Returns to the Settings tabs on release.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1151-1168",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1151-L1168"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-549",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L549"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "release",
    "short_label": "BACK",
    "action": "Returns to the Settings tabs on release.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1151-1168",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1151-L1168"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-549",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L549"
     }
    ]
   },
   {
    "mode": "glo_layer",
    "gesture": "release",
    "short_label": "RESTORE MIX",
    "action": "On release, restores mutes, levels and tempo to their state when the overlay opened without reverting flash writes.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1538-1539",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1538-L1539"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "557-599",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L557-L599"
     }
    ]
   },
   {
    "mode": "seq_layer",
    "gesture": "release",
    "short_label": "RESTORE SEQ",
    "action": "On release, restores sequence notes, automation and timing to their state when the overlay opened without reverting flash writes.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1538-1539",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1538-L1539"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "557-599",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L557-L599"
     }
    ]
   },
   {
    "mode": "learn",
    "gesture": "release",
    "short_label": "CLEAR CC",
    "action": "On release, removes the picked parameter controller assignment immediately without asking or undo and saves settings, deferred during playback.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1793-1794",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1793-L1794"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/midi_learn.c",
      "lines": "150-168",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/midi_learn.c#L150-L168"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "TEACH BUTTON",
    "action": "When prompted for this control, records its physical position in the calibration mapping.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1996-2010",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1996-L2010"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without performing the usual button action, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing on sampler pages except the song pitch, grid duration, Patterns clipboard and held-layer cases listed separately.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1745-1758",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1745-L1758"
     }
    ]
   },
   {
    "mode": "wave",
    "gesture": "press",
    "short_label": "PITCH +",
    "action": "On a song, moves selected chop pitch up one semitone within ±24, with chop undo available; on Drums it does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1755-1756",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1755-L1756"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "130-136",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L130-L136"
     }
    ]
   },
   {
    "mode": "fx1",
    "gesture": "press",
    "short_label": "PITCH +",
    "action": "On a song, moves selected chop pitch up one semitone within ±24, with chop undo available; on Drums it does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1755-1756",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1755-L1756"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "130-136",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L130-L136"
     }
    ]
   },
   {
    "mode": "fx2",
    "gesture": "press",
    "short_label": "PITCH +",
    "action": "On a song, moves selected chop pitch up one semitone within ±24, with chop undo available; on Drums it does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1755-1756",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1755-L1756"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "130-136",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L130-L136"
     }
    ]
   },
   {
    "mode": "compressor",
    "gesture": "press",
    "short_label": "PITCH +",
    "action": "On a song, moves selected chop pitch up one semitone within ±24, with chop undo available; on Drums it does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1755-1756",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1755-L1756"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "130-136",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L130-L136"
     }
    ]
   },
   {
    "mode": "makeup",
    "gesture": "press",
    "short_label": "PITCH +",
    "action": "On a song, moves selected chop pitch up one semitone within ±24, with chop undo available; on Drums it does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1755-1756",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1755-L1756"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "130-136",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L130-L136"
     }
    ]
   },
   {
    "mode": "chops",
    "gesture": "press",
    "short_label": "PITCH +",
    "action": "On a song, moves selected chop pitch up one semitone within ±24, with chop undo available; on Drums it does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1755-1756",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1755-L1756"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "130-136",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L130-L136"
     }
    ]
   },
   {
    "mode": "mute_solo",
    "gesture": "press",
    "short_label": "PITCH +",
    "action": "On a song, moves selected chop pitch up one semitone within ±24, with chop undo available; on Drums it does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1755-1756",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1755-L1756"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "130-136",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L130-L136"
     }
    ]
   },
   {
    "mode": "grid",
    "gesture": "press",
    "short_label": "STEP FASTER",
    "action": "Moves to the next shorter sequencer step duration.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1751-1753",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1751-L1753"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/params.c",
      "lines": "276-305",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/params.c#L276-L305"
     }
    ]
   },
   {
    "mode": "roll",
    "gesture": "press",
    "short_label": "STEP FASTER",
    "action": "Moves to the next shorter sequencer step duration.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1751-1753",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1751-L1753"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/params.c",
      "lines": "276-305",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/params.c#L276-L305"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "press",
    "short_label": "PASTE PHRASE",
    "action": "Pastes the clipboard and immediately saves over selected A–D without asking or flash undo while stopped and silent.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1750-1750",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1750"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "87-110",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L87-L110"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "release",
    "short_label": "SETTING + ",
    "action": "On release, advances the selected setting or runs the selected action, including clearing every MIDI LEARN assignment without a question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1538-1538",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1538"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "541-583",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L541-L583"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1151-1168",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1151-L1168"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "release",
    "short_label": "SETTING + ",
    "action": "On release, advances the selected setting or runs the selected action, including clearing every MIDI LEARN assignment without a question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1538-1538",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1538"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "541-583",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L541-L583"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1151-1168",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1151-L1168"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "release",
    "short_label": "SETTING + ",
    "action": "On release, advances the selected setting or runs the selected action, including clearing every MIDI LEARN assignment without a question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1538-1538",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1538"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "541-583",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L541-L583"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1151-1168",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1151-L1168"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "release",
    "short_label": "SETTING + ",
    "action": "On release, advances the selected setting or runs the selected action, including clearing every MIDI LEARN assignment without a question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1538-1538",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1538"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "541-583",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L541-L583"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1151-1168",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1151-L1168"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "release",
    "short_label": "SETTING + ",
    "action": "On release, advances the selected setting or runs the selected action, including clearing every MIDI LEARN assignment without a question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1538-1538",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1538"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "541-583",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L541-L583"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1151-1168",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1151-L1168"
     }
    ]
   },
   {
    "mode": "learn",
    "gesture": "release",
    "short_label": "LEARN DONE",
    "action": "On release, exits MIDI LEARN.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1793-1794",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1793-L1794"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/midi_learn.c",
      "lines": "150-168",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/midi_learn.c#L150-L168"
     }
    ]
   },
   {
    "mode": "temp_fx",
    "gesture": "press_while_holding:button_lfo",
    "short_label": "KEEP FX",
    "action": "Keeps the temporary FX changes while LFO is held instead of changing pitch.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1520-1523",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1520-L1523"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "TEACH BUTTON",
    "action": "When prompted for this control, records its physical position in the calibration mapping.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1996-2010",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1996-L2010"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_with:button_oct_down",
    "short_label": "USB UPDATE",
    "action": "With both OCT buttons held for more than five seconds, enters the boot updater after a countdown beginning at two seconds.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1745-1764",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1745-L1764"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "229-255",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L229-L255"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1609-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1609-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without performing the usual button action, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "encoder_algorithm": [
   {
    "mode": "any",
    "gesture": "turn",
    "short_label": "TRACK",
    "action": "Chooses Song 1, Drums or Song 2, one track per turn direction.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1869-1874",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "turn",
    "short_label": "SETTINGS TAB",
    "action": "Moves between the five Settings tabs, wrapping at either end.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "533-539",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L533-L539"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "turn",
    "short_label": "SETTINGS TAB",
    "action": "Moves between the five Settings tabs, wrapping at either end.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "533-539",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L533-L539"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "turn",
    "short_label": "SETTINGS TAB",
    "action": "Moves between the five Settings tabs, wrapping at either end.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "533-539",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L533-L539"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "turn",
    "short_label": "SETTINGS TAB",
    "action": "Moves between the five Settings tabs, wrapping at either end.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "533-539",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L533-L539"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "turn",
    "short_label": "SETTINGS TAB",
    "action": "Moves between the five Settings tabs, wrapping at either end.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "533-539",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L533-L539"
     }
    ]
   },
   {
    "mode": "glo_layer",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing while the held layer owns input.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1559-1572",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1559-L1572"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1850-1869",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1850-L1869"
     }
    ]
   },
   {
    "mode": "seq_layer",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing while the held layer owns input.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1559-1572",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1559-L1572"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1850-1869",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1850-L1869"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "short_label": "TEACH KNOB",
    "action": "When prompted, records this encoder position and clockwise direction; settings are saved by the boot path or when Settings closes without a separate question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2013-2039",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2013-L2039"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "turn",
    "short_label": "WAKE",
    "action": "Wakes the screen without changing a value, with input swallowed until the encoder is quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "encoder_select": [
   {
    "mode": "any",
    "gesture": "turn",
    "short_label": "TEMPO",
    "action": "Sets global tempo from 40 to 240 BPM unless BPM LOCK is enabled.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1875-1884",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1875-L1884"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/params.c",
      "lines": "185-185",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/params.c#L185"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "541-585",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L541-L585"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "541-585",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L541-L585"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "541-585",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L541-L585"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "541-585",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L541-L585"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "541-585",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L541-L585"
     }
    ]
   },
   {
    "mode": "glo_layer",
    "gesture": "turn_while_holding:button_glo",
    "short_label": "HELD TEMPO",
    "action": "Sets tempo even when BPM LOCK is on.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1571-1572",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1571-L1572"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1875-1884",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1875-L1884"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "short_label": "TEACH KNOB",
    "action": "When prompted, records this encoder position and clockwise direction; settings are saved by the boot path or when Settings closes without a separate question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2013-2039",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2013-L2039"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing while this Settings information page is open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-553",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L553"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "turn",
    "short_label": "WAKE",
    "action": "Wakes the screen without changing a value, with input swallowed until the encoder is quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "encoder_presets": [
   {
    "mode": "any",
    "gesture": "turn",
    "short_label": "CHOP",
    "action": "On a song page, chooses a chop and its keyboard bank, except on pages with a specific PRESETS action; on Drums it does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1851-1860",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1851-L1860"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "75-83",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L75-L83"
     }
    ]
   },
   {
    "mode": "roll",
    "gesture": "turn",
    "short_label": "NOTE ROWS",
    "action": "Scrolls piano-roll note rows.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1853-1859",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1853-L1859"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "130-164",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L130-L164"
     }
    ]
   },
   {
    "mode": "step",
    "gesture": "turn",
    "short_label": "DETAIL STEP",
    "action": "Chooses the step to edit.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1853-1859",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1853-L1859"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "130-164",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L130-L164"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "turn",
    "short_label": "CHOOSE SLOT",
    "action": "Selects A–D or queues a saved phrase during pattern playback, requiring a repeated selection before discarding unsaved stopped edits.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1853-1859",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1853-L1859"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "130-164",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L130-L164"
     }
    ]
   },
   {
    "mode": "arrangement",
    "gesture": "turn",
    "short_label": "CHOOSE ROW",
    "action": "Selects an arrangement section.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1853-1859",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1853-L1859"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "130-164",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L130-L164"
     }
    ]
   },
   {
    "mode": "step_pitch",
    "gesture": "turn",
    "short_label": "CHOP",
    "action": "Chooses a song chop despite the screen step-selection hint, with no effect on Drums.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1853-1859",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1853-L1859"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "130-164",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L130-L164"
     }
    ]
   },
   {
    "mode": "settings_display",
    "gesture": "turn",
    "short_label": "SETTINGS ROW",
    "action": "Moves between the visible rows in this tab, wrapping at either end.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "527-531",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L527-L531"
     }
    ]
   },
   {
    "mode": "settings_control",
    "gesture": "turn",
    "short_label": "SETTINGS ROW",
    "action": "Moves between the visible rows in this tab, wrapping at either end.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "527-531",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L527-L531"
     }
    ]
   },
   {
    "mode": "settings_audio",
    "gesture": "turn",
    "short_label": "SETTINGS ROW",
    "action": "Moves between the visible rows in this tab, wrapping at either end.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "527-531",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L527-L531"
     }
    ]
   },
   {
    "mode": "settings_midi",
    "gesture": "turn",
    "short_label": "SETTINGS ROW",
    "action": "Moves between the visible rows in this tab, wrapping at either end.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "527-531",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L527-L531"
     }
    ]
   },
   {
    "mode": "settings_system",
    "gesture": "turn",
    "short_label": "SETTINGS ROW",
    "action": "Moves between the visible rows in this tab, wrapping at either end.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "527-531",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L527-L531"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-552",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L552"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "turn",
    "short_label": "CREDITS",
    "action": "Scrolls the credits.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "546-552",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L546-L552"
     }
    ]
   },
   {
    "mode": "glo_layer",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing while the held layer owns input.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1559-1572",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1559-L1572"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1850-1869",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1850-L1869"
     }
    ]
   },
   {
    "mode": "seq_layer",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing while the held layer owns input.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1559-1572",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1559-L1572"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1850-1869",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1850-L1869"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "short_label": "TEACH KNOB",
    "action": "When prompted, records this encoder position and clockwise direction; settings are saved by the boot path or when Settings closes without a separate question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2013-2039",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2013-L2039"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "turn",
    "short_label": "WAKE",
    "action": "Wakes the screen without changing a value, with input swallowed until the encoder is quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "knob_master": [
   {
    "mode": "any",
    "gesture": "turn",
    "short_label": "VOLUME",
    "action": "Changes output volume, with USB output following it only when USB LEVEL is MASTER.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "225-225",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L225"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/menu_items.c",
      "lines": "125-131",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/menu_items.c#L125-L131"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/fx.c",
      "lines": "121-133",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/fx.c#L121-L133"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/fx.c",
      "lines": "920-933",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/fx.c#L920-L933"
     }
    ]
   }
  ],
  "switch_power": [
   {
    "mode": "any",
    "gesture": "power_on_holding:button_oct_down+button_oct_up",
    "short_label": "CALIBRATE",
    "action": "Starts panel calibration at power-on and afterward saves the complete preferences only if their saved contents differ, even after cancellation, without another question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1985-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1985-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/project.c",
      "lines": "1186-1210",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/project.c#L1186-L1210"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "power_on_holding:button_oct_down",
    "short_label": "RECOVERY",
    "action": "Holding OCT− alone while switching on requests the saved recovery loader, falling back to USB boot recovery if no valid loader remains or its handoff has already failed.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub_core.h",
      "lines": "19-25",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub_core.h#L19-L25"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub_core.h",
      "lines": "249-279",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub_core.h#L249-L279"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub.c",
      "lines": "281-313",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub.c#L281-L313"
     }
    ]
   }
  ],
  "key_f3": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 1 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Plays and selects chop 28 in the second key bank.",
    "short_label": "CHOP 28",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "75-83",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L75-L83"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 1 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 28 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Plays pad 1 and selects it for the pad settings page.",
    "short_label": "PAD 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1827",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1827"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "hold",
    "action": "Retriggers this pad at the chosen roll rate while drum rolls are enabled.",
    "short_label": "PAD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-672",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L672"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "725-732",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L725-L732"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "release",
    "action": "Stops this pad’s held roll while its current one-shot hit can finish.",
    "short_label": "ROLL STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop or kit pad at the selected step immediately without sounding it, with four notes allowed and no question.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped chop or pad at the current step, replacing its previous notes when a new chord begins and retaining up to four notes.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped chop or pad in the running phrase, subject to the live quantization setting.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Requests pattern A for all tracks, warning before discarding unsaved edits while stopped or queuing an occupied slot during pattern playback.",
    "short_label": "PATTERN A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "65-85",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L65-L85"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Adds pattern A as a new section after the selected section while stopped, up to sixteen sections; SAVE stores the arrangement.",
    "short_label": "APPEND A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "112-118",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L112-L118"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Temporarily solos Song 1 while this key remains held, without changing the stored mute settings.",
    "short_label": "SOLO S1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-452",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L452"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "481-495",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L481-L495"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "release",
    "action": "Releases this key’s temporary solo.",
    "short_label": "SOLO END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "481-495",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L481-L495"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Clears the selected track’s notes inside its current length and removes locks from newly emptied steps immediately, without a question; SAVE undo restores the last change in memory.",
    "short_label": "CLEAR STEPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "334-377",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L334-L377"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "48-80",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L48-L80"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "325-348",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L325-L348"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_fs3": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 17 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 17",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 17 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Does nothing on the drum kit.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop at the selected step immediately without sounding it, with four notes allowed; it does nothing on the kit.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped song chop at the current step with up to four notes; it does nothing on the kit.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped song chop in the running phrase; it does nothing on the kit.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Toggles the mute for Song 1 immediately without a question.",
    "short_label": "MUTE S1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-450",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L450"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing because the sampler kit is not the inherited drum-synth engine.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "62-64",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L62-L64"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_g3": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 2 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Plays and selects chop 29 in the second key bank.",
    "short_label": "CHOP 29",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "75-83",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L75-L83"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 2 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 29 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Plays pad 2 and selects it for the pad settings page.",
    "short_label": "PAD 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1827",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1827"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "hold",
    "action": "Retriggers this pad at the chosen roll rate while drum rolls are enabled.",
    "short_label": "PAD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-672",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L672"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "725-732",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L725-L732"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "release",
    "action": "Stops this pad’s held roll while its current one-shot hit can finish.",
    "short_label": "ROLL STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop or kit pad at the selected step immediately without sounding it, with four notes allowed and no question.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped chop or pad at the current step, replacing its previous notes when a new chord begins and retaining up to four notes.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped chop or pad in the running phrase, subject to the live quantization setting.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Requests pattern B for all tracks, warning before discarding unsaved edits while stopped or queuing an occupied slot during pattern playback.",
    "short_label": "PATTERN B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "65-85",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L65-L85"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Adds pattern B as a new section after the selected section while stopped, up to sixteen sections; SAVE stores the arrangement.",
    "short_label": "APPEND B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "112-118",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L112-L118"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Temporarily solos the kit while this key remains held, without changing the stored mute settings.",
    "short_label": "SOLO KIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-452",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L452"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "481-495",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L481-L495"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "release",
    "action": "Releases this key’s temporary solo.",
    "short_label": "SOLO END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "481-495",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L481-L495"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Reverses steps inside the selected track’s current length with their automation and locks; SAVE undo restores the last change in memory.",
    "short_label": "REVERSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "334-377",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L334-L377"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "48-80",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L48-L80"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "325-348",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L325-L348"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_gs3": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 18 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 18",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 18 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Does nothing on the drum kit.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop at the selected step immediately without sounding it, with four notes allowed; it does nothing on the kit.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped song chop at the current step with up to four notes; it does nothing on the kit.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped song chop in the running phrase; it does nothing on the kit.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Toggles the mute for the kit immediately without a question.",
    "short_label": "MUTE KIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-450",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L450"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing because the sampler kit is not the inherited drum-synth engine.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "62-64",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L62-L64"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_a3": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 3 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Plays and selects chop 30 in the second key bank.",
    "short_label": "CHOP 30",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "75-83",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L75-L83"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 3 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 30 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Plays pad 3 and selects it for the pad settings page.",
    "short_label": "PAD 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1827",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1827"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "hold",
    "action": "Retriggers this pad at the chosen roll rate while drum rolls are enabled.",
    "short_label": "PAD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-672",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L672"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "725-732",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L725-L732"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "release",
    "action": "Stops this pad’s held roll while its current one-shot hit can finish.",
    "short_label": "ROLL STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop or kit pad at the selected step immediately without sounding it, with four notes allowed and no question.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped chop or pad at the current step, replacing its previous notes when a new chord begins and retaining up to four notes.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped chop or pad in the running phrase, subject to the live quantization setting.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Requests pattern C for all tracks, warning before discarding unsaved edits while stopped or queuing an occupied slot during pattern playback.",
    "short_label": "PATTERN C",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "65-85",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L65-L85"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Adds pattern C as a new section after the selected section while stopped, up to sixteen sections; SAVE stores the arrangement.",
    "short_label": "APPEND C",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "112-118",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L112-L118"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Temporarily solos Song 2 while this key remains held, without changing the stored mute settings.",
    "short_label": "SOLO S2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-452",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L452"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "481-495",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L481-L495"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "release",
    "action": "Releases this key’s temporary solo.",
    "short_label": "SOLO END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "481-495",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L481-L495"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Rotates steps one position earlier inside the selected track’s current length with their automation and locks; SAVE undo restores the last change in memory.",
    "short_label": "SHIFT LEFT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "334-377",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L334-L377"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "48-80",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L48-L80"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "325-348",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L325-L348"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_as3": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 19 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 19",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 19 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Does nothing on the drum kit.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop at the selected step immediately without sounding it, with four notes allowed; it does nothing on the kit.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped song chop at the current step with up to four notes; it does nothing on the kit.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped song chop in the running phrase; it does nothing on the kit.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Toggles the mute for Song 2 immediately without a question.",
    "short_label": "MUTE S2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-450",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L450"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing because the sampler kit is not the inherited drum-synth engine.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "62-64",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L62-L64"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_b3": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 4 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Plays and selects chop 31 in the second key bank.",
    "short_label": "CHOP 31",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "75-83",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L75-L83"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 4 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 31 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Plays pad 4 and selects it for the pad settings page.",
    "short_label": "PAD 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1827",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1827"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "hold",
    "action": "Retriggers this pad at the chosen roll rate while drum rolls are enabled.",
    "short_label": "PAD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-672",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L672"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "725-732",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L725-L732"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "release",
    "action": "Stops this pad’s held roll while its current one-shot hit can finish.",
    "short_label": "ROLL STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop or kit pad at the selected step immediately without sounding it, with four notes allowed and no question.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped chop or pad at the current step, replacing its previous notes when a new chord begins and retaining up to four notes.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped chop or pad in the running phrase, subject to the live quantization setting.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Requests pattern D for all tracks, warning before discarding unsaved edits while stopped or queuing an occupied slot during pattern playback.",
    "short_label": "PATTERN D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "65-85",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L65-L85"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Adds pattern D as a new section after the selected section while stopped, up to sixteen sections; SAVE stores the arrangement.",
    "short_label": "APPEND D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "112-118",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L112-L118"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Rotates steps one position later inside the selected track’s current length with their automation and locks; SAVE undo restores the last change in memory.",
    "short_label": "SHIFT RIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "334-377",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L334-L377"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "48-80",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L48-L80"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "325-348",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L325-L348"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_c4": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 5 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Plays and selects chop 32 in the second key bank.",
    "short_label": "CHOP 32",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "75-83",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L75-L83"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 5 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 32 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Plays pad 5 and selects it for the pad settings page.",
    "short_label": "PAD 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1827",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1827"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "hold",
    "action": "Retriggers this pad at the chosen roll rate while drum rolls are enabled.",
    "short_label": "PAD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-672",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L672"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "725-732",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L725-L732"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "release",
    "action": "Stops this pad’s held roll while its current one-shot hit can finish.",
    "short_label": "ROLL STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop or kit pad at the selected step immediately without sounding it, with four notes allowed and no question.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped chop or pad at the current step, replacing its previous notes when a new chord begins and retaining up to four notes.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped chop or pad in the running phrase, subject to the live quantization setting.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Unmutes all tracks immediately without a question.",
    "short_label": "UNMUTE ALL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "453-455",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L453-L455"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Replaces notes inside the selected track’s current length with a generated phrase immediately, without a question; SAVE undo restores the last change in memory.",
    "short_label": "RANDOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "334-377",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L334-L377"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "48-80",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L48-L80"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "325-348",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L325-L348"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_cs4": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 20 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 20",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 20 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Does nothing on the drum kit.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop at the selected step immediately without sounding it, with four notes allowed; it does nothing on the kit.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped song chop at the current step with up to four notes; it does nothing on the kit.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped song chop in the running phrase; it does nothing on the kit.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing because the sampler kit is not the inherited drum-synth engine.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "62-64",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L62-L64"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_d4": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 6 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 6 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Plays pad 6 and selects it for the pad settings page.",
    "short_label": "PAD 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1827",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1827"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "hold",
    "action": "Retriggers this pad at the chosen roll rate while drum rolls are enabled.",
    "short_label": "PAD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-672",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L672"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "725-732",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L725-L732"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "release",
    "action": "Stops this pad’s held roll while its current one-shot hit can finish.",
    "short_label": "ROLL STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop or kit pad at the selected step immediately without sounding it, with four notes allowed and no question.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped chop or pad at the current step, replacing its previous notes when a new chord begins and retaining up to four notes.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped chop or pad in the running phrase, subject to the live quantization setting.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Turns MIDI Learn on or off.",
    "short_label": "MIDI LEARN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "458-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L458-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Changes some existing notes, accents or probabilities inside the selected track’s current length immediately, without a question; SAVE undo restores the last change in memory.",
    "short_label": "COOK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "334-377",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L334-L377"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "48-80",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L48-L80"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "325-348",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L325-L348"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_ds4": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 21 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 21",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 21 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Does nothing on the drum kit.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop at the selected step immediately without sounding it, with four notes allowed; it does nothing on the kit.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped song chop at the current step with up to four notes; it does nothing on the kit.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped song chop in the running phrase; it does nothing on the kit.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing because the sampler kit is not the inherited drum-synth engine.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "62-64",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L62-L64"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_e4": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 7 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 7 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Plays pad 7 and selects it for the pad settings page.",
    "short_label": "PAD 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1827",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1827"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "hold",
    "action": "Retriggers this pad at the chosen roll rate while drum rolls are enabled.",
    "short_label": "PAD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-672",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L672"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "725-732",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L725-L732"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "release",
    "action": "Stops this pad’s held roll while its current one-shot hit can finish.",
    "short_label": "ROLL STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop or kit pad at the selected step immediately without sounding it, with four notes allowed and no question.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped chop or pad at the current step, replacing its previous notes when a new chord begins and retaining up to four notes.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped chop or pad in the running phrase, subject to the live quantization setting.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing for the three sampler tracks.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "14-25",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L14-L25"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_f4": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 8 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 8 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Plays pad 8 and selects it for the pad settings page.",
    "short_label": "PAD 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1827",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1827"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "hold",
    "action": "Retriggers this pad at the chosen roll rate while drum rolls are enabled.",
    "short_label": "PAD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-672",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L672"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "725-732",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L725-L732"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "release",
    "action": "Stops this pad’s held roll while its current one-shot hit can finish.",
    "short_label": "ROLL STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop or kit pad at the selected step immediately without sounding it, with four notes allowed and no question.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped chop or pad at the current step, replacing its previous notes when a new chord begins and retaining up to four notes.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped chop or pad in the running phrase, subject to the live quantization setting.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Sets tempo from the third tap onward using recent taps when the clock is internal.",
    "short_label": "TAP TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "301-321",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L301-L321"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "456-457",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L456-L457"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing for the three sampler tracks.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "14-25",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L14-L25"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_fs4": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 22 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 22",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 22 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Does nothing on the drum kit.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop at the selected step immediately without sounding it, with four notes allowed; it does nothing on the kit.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped song chop at the current step with up to four notes; it does nothing on the kit.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped song chop in the running phrase; it does nothing on the kit.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing because the sampler kit is not the inherited drum-synth engine.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "62-64",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L62-L64"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_g4": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 9 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 9 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Plays pad 9 and selects it for the pad settings page.",
    "short_label": "PAD 9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1827",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1827"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "hold",
    "action": "Retriggers this pad at the chosen roll rate while drum rolls are enabled.",
    "short_label": "PAD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-672",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L672"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "725-732",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L725-L732"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "release",
    "action": "Stops this pad’s held roll while its current one-shot hit can finish.",
    "short_label": "ROLL STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop or kit pad at the selected step immediately without sounding it, with four notes allowed and no question.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped chop or pad at the current step, replacing its previous notes when a new chord begins and retaining up to four notes.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped chop or pad in the running phrase, subject to the live quantization setting.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing for the three sampler tracks.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "14-25",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L14-L25"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_gs4": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 23 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 23",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 23 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Does nothing on the drum kit.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop at the selected step immediately without sounding it, with four notes allowed; it does nothing on the kit.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped song chop at the current step with up to four notes; it does nothing on the kit.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped song chop in the running phrase; it does nothing on the kit.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing because the sampler kit is not the inherited drum-synth engine.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "62-64",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L62-L64"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_a4": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 10 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 10 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Plays pad 10 and selects it for the pad settings page.",
    "short_label": "PAD 10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1827",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1827"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "hold",
    "action": "Retriggers this pad at the chosen roll rate while drum rolls are enabled.",
    "short_label": "PAD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-672",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L672"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "725-732",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L725-L732"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "release",
    "action": "Stops this pad’s held roll while its current one-shot hit can finish.",
    "short_label": "ROLL STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop or kit pad at the selected step immediately without sounding it, with four notes allowed and no question.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped chop or pad at the current step, replacing its previous notes when a new chord begins and retaining up to four notes.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped chop or pad in the running phrase, subject to the live quantization setting.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing for the three sampler tracks.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "14-25",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L14-L25"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_as4": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 24 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 24",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 24 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Does nothing on the drum kit.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop at the selected step immediately without sounding it, with four notes allowed; it does nothing on the kit.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped song chop at the current step with up to four notes; it does nothing on the kit.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped song chop in the running phrase; it does nothing on the kit.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing because the sampler kit is not the inherited drum-synth engine.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "62-64",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L62-L64"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_b4": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 11 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 11 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Plays pad 11 and selects it for the pad settings page.",
    "short_label": "PAD 11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1827",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1827"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "hold",
    "action": "Retriggers this pad at the chosen roll rate while drum rolls are enabled.",
    "short_label": "PAD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-672",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L672"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "725-732",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L725-L732"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "release",
    "action": "Stops this pad’s held roll while its current one-shot hit can finish.",
    "short_label": "ROLL STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop or kit pad at the selected step immediately without sounding it, with four notes allowed and no question.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped chop or pad at the current step, replacing its previous notes when a new chord begins and retaining up to four notes.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped chop or pad in the running phrase, subject to the live quantization setting.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing for the three sampler tracks.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "14-25",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L14-L25"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_c5": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 12 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 12 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Plays pad 12 and selects it for the pad settings page.",
    "short_label": "PAD 12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1827",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1827"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "hold",
    "action": "Retriggers this pad at the chosen roll rate while drum rolls are enabled.",
    "short_label": "PAD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-672",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L672"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "725-732",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L725-L732"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "release",
    "action": "Stops this pad’s held roll while its current one-shot hit can finish.",
    "short_label": "ROLL STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop or kit pad at the selected step immediately without sounding it, with four notes allowed and no question.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped chop or pad at the current step, replacing its previous notes when a new chord begins and retaining up to four notes.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped chop or pad in the running phrase, subject to the live quantization setting.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing for the three sampler tracks.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "14-25",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L14-L25"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_cs5": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 25 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 25",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 25 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Does nothing on the drum kit.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop at the selected step immediately without sounding it, with four notes allowed; it does nothing on the kit.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped song chop at the current step with up to four notes; it does nothing on the kit.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped song chop in the running phrase; it does nothing on the kit.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing because the sampler kit is not the inherited drum-synth engine.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "62-64",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L62-L64"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_d5": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 13 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 13 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Plays pad 13 and selects it for the pad settings page.",
    "short_label": "PAD 13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1827",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1827"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "hold",
    "action": "Retriggers this pad at the chosen roll rate while drum rolls are enabled.",
    "short_label": "PAD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-672",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L672"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "725-732",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L725-L732"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "release",
    "action": "Stops this pad’s held roll while its current one-shot hit can finish.",
    "short_label": "ROLL STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop or kit pad at the selected step immediately without sounding it, with four notes allowed and no question.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped chop or pad at the current step, replacing its previous notes when a new chord begins and retaining up to four notes.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped chop or pad in the running phrase, subject to the live quantization setting.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing for the three sampler tracks.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "14-25",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L14-L25"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_ds5": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 26 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 26",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 26 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Does nothing on the drum kit.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop at the selected step immediately without sounding it, with four notes allowed; it does nothing on the kit.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped song chop at the current step with up to four notes; it does nothing on the kit.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped song chop in the running phrase; it does nothing on the kit.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing because the sampler kit is not the inherited drum-synth engine.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "62-64",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L62-L64"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_e5": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 14 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 14 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Plays pad 14 and selects it for the pad settings page.",
    "short_label": "PAD 14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1827",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1827"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "hold",
    "action": "Retriggers this pad at the chosen roll rate while drum rolls are enabled.",
    "short_label": "PAD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-672",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L672"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "725-732",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L725-L732"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "release",
    "action": "Stops this pad’s held roll while its current one-shot hit can finish.",
    "short_label": "ROLL STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop or kit pad at the selected step immediately without sounding it, with four notes allowed and no question.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped chop or pad at the current step, replacing its previous notes when a new chord begins and retaining up to four notes.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped chop or pad in the running phrase, subject to the live quantization setting.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing for the three sampler tracks.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "14-25",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L14-L25"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_f5": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 15 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 15 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Plays pad 15 and selects it for the pad settings page.",
    "short_label": "PAD 15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1827",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1827"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "hold",
    "action": "Retriggers this pad at the chosen roll rate while drum rolls are enabled.",
    "short_label": "PAD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-672",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L672"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "725-732",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L725-L732"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "release",
    "action": "Stops this pad’s held roll while its current one-shot hit can finish.",
    "short_label": "ROLL STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop or kit pad at the selected step immediately without sounding it, with four notes allowed and no question.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped chop or pad at the current step, replacing its previous notes when a new chord begins and retaining up to four notes.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped chop or pad in the running phrase, subject to the live quantization setting.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing for the three sampler tracks.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "14-25",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L14-L25"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_fs5": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 27 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 27",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 27 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Does nothing on the drum kit.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop at the selected step immediately without sounding it, with four notes allowed; it does nothing on the kit.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped song chop at the current step with up to four notes; it does nothing on the kit.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped song chop in the running phrase; it does nothing on the kit.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing because the sampler kit is not the inherited drum-synth engine.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "62-64",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L62-L64"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ],
  "key_g5": [
   {
    "mode": "k_song",
    "gesture": "press",
    "action": "Plays and selects chop 16 when present on the chosen song, or releases its existing latched voice on another press.",
    "short_label": "CHOP 16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1803-1808",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1803-L1808"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "400-411",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L400-L411"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "hold",
    "action": "Repeats a held chop only when looping is enabled and its trigger is not ONE-SHOT.",
    "short_label": "HOLD CHOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "541-550",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L541-L550"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "676-684",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L676-L684"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko.c",
      "lines": "206-217",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L206-L217"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "release",
    "action": "Releases a held chop through its envelope while one-shot and latched playback can continue.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/voice.c",
      "lines": "492-500",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/voice.c#L492-L500"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "647-663",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L647-L663"
     }
    ]
   },
   {
    "mode": "k_song_later",
    "gesture": "press",
    "action": "Does nothing because this key falls beyond the 32 available chops.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "66-70",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L66-L70"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "779-786",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L779-L786"
     }
    ]
   },
   {
    "mode": "k_song",
    "gesture": "press_while_holding:button_edit",
    "action": "Auditions the ending of chop 16 once without recording or MIDI output, but pressing EDIT first opens Chop playback from the waveform, resets the track effects from either FX page, or clears the stopped grid step and advances without asking.",
    "short_label": "TAIL PREVIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1477-1479",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1477-L1479"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "897-904",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L897-L904"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "519-535",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L519-L535"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_slice.c",
      "lines": "553-558",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_slice.c#L553-L558"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1389",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1365-L1389"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1726-1733",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1726-L1733"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "press",
    "action": "Plays pad 16 and selects it for the pad settings page.",
    "short_label": "PAD 16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1827",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1827"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "hold",
    "action": "Retriggers this pad at the chosen roll rate while drum rolls are enabled.",
    "short_label": "PAD ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-672",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L672"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "725-732",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L725-L732"
     }
    ]
   },
   {
    "mode": "k_kit",
    "gesture": "release",
    "action": "Stops this pad’s held roll while its current one-shot hit can finish.",
    "short_label": "ROLL STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_toggle",
    "gesture": "press",
    "action": "Toggles this key’s mapped song chop or kit pad at the selected step immediately without sounding it, with four notes allowed and no question.",
    "short_label": "TOGGLE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1817-1825",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1817-L1825"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-895",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L895"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "press",
    "action": "Plays and writes this mapped chop or pad at the current step, replacing its previous notes when a new chord begins and retaining up to four notes.",
    "short_label": "WRITE CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_state.h",
      "lines": "40-52",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "release",
    "action": "If this key contributed a note, releasing the chord’s final held key advances once and wraps at the sequence length.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "654-664",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L654-L664"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-710",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L710"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "press",
    "action": "Plays and records this mapped chop or pad in the running phrase, subject to the live quantization setting.",
    "short_label": "LIVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "630-639",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "667-695",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L695"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/eng_sample.c",
      "lines": "241-245",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/eng_sample.c#L241-L245"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "release",
    "action": "Releases this playable key and stops its held roll if applicable, while the stored sampler step remains a trigger rather than recording a held-note gate.",
    "short_label": "GATE END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "553-573",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L553-L573"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_arrange.c",
      "lines": "168-173",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-890",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L890"
     }
    ]
   },
   {
    "mode": "k_arrange_tools",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_variations",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_advanced",
    "gesture": "press",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1829",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1797-L1829"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in the GLO shortcuts.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-459",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L447-L459"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing for the three sampler tracks.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "14-25",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L14-L25"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "474-478",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L474-L478"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "press",
    "short_label": "MENU PLAY",
    "action": "Plays this key’s mapped chop or kit pad when present, following its current bank and recording state without selecting a different chop or pad for editing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1587-1615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1587-L1615"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_name.c",
      "lines": "62",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_name.c#L62"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "870-907",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L870-L907"
     }
    ]
   },
   {
    "mode": "k_settings",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases its held chop or roll according to the trigger settings, with one-shot or latched audio allowed to continue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "700-722",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L700-L722"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "822-833",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L822-L833"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "short_label": "CANCEL SETUP",
    "action": "Cancels calibration and restores its prior mapping, with the boot path or a later Settings close still able to save changed settings without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1940-1943",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1940-L1943"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "2040-2044",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L2040-L2044"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "189-192",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L192"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_menu.c",
      "lines": "515-520",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
     }
    ]
   },
   {
    "mode": "screen_sleep",
    "gesture": "press",
    "short_label": "WAKE",
    "action": "Wakes the screen without playing or editing, with input swallowed until release and a quiet interval.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui.c",
      "lines": "264-283",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L264-L283"
     }
    ]
   }
  ]
 },
 "lights": {
  "button_fx": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Unused buttons have a low glow with DIM HI or DIM LO selected; OFF removes it and INV lights inactive buttons.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "443-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L443-L458"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Unused buttons have a low glow with DIM HI or DIM LO selected; OFF removes it and INV lights inactive buttons.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "443-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L443-L458"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Unused buttons have a low glow with DIM HI or DIM LO selected; OFF removes it and INV lights inactive buttons.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "443-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L443-L458"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Unused buttons have a low glow with DIM HI or DIM LO selected; OFF removes it and INV lights inactive buttons.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "443-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L443-L458"
     }
    ]
   },
   {
    "mode": "boot",
    "gesture": "flash",
    "short_label": "LOADER",
    "action": "During recovery, three short flashes in the first panel column mean the saved update loader is taking over.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub.c",
      "lines": "178-188",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub.c#L178-L188"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub.c",
      "lines": "303-313",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub.c#L303-L313"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/hal/fm1_input.h",
      "lines": "149-156",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/hal/fm1_input.h#L149-L156"
     }
    ]
   },
   {
    "mode": "boot",
    "gesture": "flash",
    "short_label": "USB RECOVERY",
    "action": "During recovery, one long flash in the first panel column means the unit is entering USB boot recovery because a usable loader was unavailable or its handoff had already failed.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub.c",
      "lines": "178-188",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub.c#L178-L188"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub.c",
      "lines": "303-313",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub.c#L303-L313"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/hal/fm1_input.h",
      "lines": "149-156",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/hal/fm1_input.h#L149-L156"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Unused buttons have a low glow with DIM HI or DIM LO selected; OFF removes it and INV lights inactive buttons.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "443-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L443-L458"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Unused buttons have a low glow with DIM HI or DIM LO selected; OFF removes it and INV lights inactive buttons.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "443-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L443-L458"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "breathing",
    "action": "Its shortcut layer is open, held or locked.",
    "short_label": "SHORTCUTS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "420-421",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L420-L421"
     }
    ]
   }
  ],
  "button_home": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Unused buttons have a low glow with DIM HI or DIM LO selected; OFF removes it and INV lights inactive buttons.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "443-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L443-L458"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Sampler pages keep the HOME family indicator active, shown dark instead when LEDs are inverted.",
    "short_label": "HOME FAMILY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "38-41",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L38-L41"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "414-415",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L414-L415"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "447-449",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L447-L449"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ko_ui.c",
      "lines": "17",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L17"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Unused buttons have a low glow with DIM HI or DIM LO selected; OFF removes it and INV lights inactive buttons.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "443-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L443-L458"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Unused buttons have a low glow with DIM HI or DIM LO selected; OFF removes it and INV lights inactive buttons.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "443-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L443-L458"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Unused buttons have a low glow with DIM HI or DIM LO selected; OFF removes it and INV lights inactive buttons.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "443-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L443-L458"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "breathing",
    "action": "Its shortcut layer is open, held or locked.",
    "short_label": "SHORTCUTS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "420-421",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L420-L421"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Unused buttons have a low glow with DIM HI or DIM LO selected; OFF removes it and INV lights inactive buttons.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "443-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L443-L458"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Its green light stays on during playback while the other PLAY light is kept dark.",
    "short_label": "GREEN PLAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "445-461",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L445-L461"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "flash",
    "action": "Its green light marks each count-in beat.",
    "short_label": "COUNT BEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "460-461",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L460-L461"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "An unarmed REC has a faint glow in DIM HI or DIM LO, and is dark with OFF or INV selected.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "443-465",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L443-L465"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "At least one track is armed, with this indicator kept bright even in inverted or dark LED modes.",
    "short_label": "ARMED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "462-465",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L462-L465"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Unused buttons have a low glow with DIM HI or DIM LO selected; OFF removes it and INV lights inactive buttons.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "443-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L443-L458"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Marks Back on Information or About, a restore snapshot in a held shortcut, or a global octave below zero, with normal LED polarity.",
    "short_label": "BACK / OCT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "110-126",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L110-L126"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "breathing",
    "action": "The selected Settings value can move downward.",
    "short_label": "VALUE DOWN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "116-121",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L116-L121"
     }
    ]
   },
   {
    "mode": "boot",
    "gesture": "flash",
    "short_label": "LOADER",
    "action": "During recovery, three short flashes in the first panel column mean the saved update loader is taking over.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub.c",
      "lines": "178-188",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub.c#L178-L188"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub.c",
      "lines": "303-313",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub.c#L303-L313"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/hal/fm1_input.h",
      "lines": "149-156",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/hal/fm1_input.h#L149-L156"
     }
    ]
   },
   {
    "mode": "boot",
    "gesture": "flash",
    "short_label": "USB RECOVERY",
    "action": "During recovery, one long flash in the first panel column means the unit is entering USB boot recovery because a usable loader was unavailable or its handoff had already failed.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub.c",
      "lines": "178-188",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub.c#L178-L188"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub.c",
      "lines": "303-313",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub.c#L303-L313"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/hal/fm1_input.h",
      "lines": "149-156",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/hal/fm1_input.h#L149-L156"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Unused buttons have a low glow with DIM HI or DIM LO selected; OFF removes it and INV lights inactive buttons.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "443-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L443-L458"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "The legacy global octave is above zero; this light does not track the selected chop’s pitch.",
    "short_label": "OCTAVE UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "124-126",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L124-L126"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "1751-1757",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1751-L1757"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "breathing",
    "action": "The selected Settings item can increase or open, or a confirmation can proceed.",
    "short_label": "VALUE / YES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "116-123",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L116-L123"
     }
    ]
   }
  ],
  "key_lights": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "On regular sampler pages, active keys identify sounding voices on the selected track, with inverted polarity under INV and separate roles for recording and pattern selection.",
    "short_label": "SOUNDING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "338-361",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L338-L361"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "428-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L428-L458"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "lit",
    "action": "With normal LED polarity, the first four white keys show the selected pattern, or the active arrangement slot while the chain runs.",
    "short_label": "PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "340-345",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L340-L345"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "428-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L428-L458"
     }
    ]
   },
   {
    "mode": "k_arrange",
    "gesture": "lit",
    "action": "With normal LED polarity, the first four white keys show the selected pattern, or the active arrangement slot while the chain runs.",
    "short_label": "PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "340-345",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L340-L345"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "428-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L428-L458"
     }
    ]
   },
   {
    "mode": "k_patterns",
    "gesture": "blinking",
    "action": "A queued pattern’s white key flashes while waiting for its launch boundary.",
    "short_label": "QUEUED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "340-345",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L340-L345"
     }
    ]
   },
   {
    "mode": "k_live_rec",
    "gesture": "lit",
    "action": "With normal LED polarity, one white key marks the playing step within its sixteen-step page when the selected track is armed.",
    "short_label": "REC STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "348-351",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L348-L351"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "428-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L428-L458"
     }
    ]
   },
   {
    "mode": "k_step_rec",
    "gesture": "lit",
    "action": "With normal LED polarity, a white key marks an armed cursor inside the first sixteen steps, while later stopped cursors have no reliable indicator.",
    "short_label": "REC CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "348-351",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L348-L351"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "lit",
    "action": "The first three black keys mark tracks allowed to sound and held white solo keys light; the MIDI Learn key lights when enabled.",
    "short_label": "MIX STATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "605-615",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L605-L615"
     }
    ]
   },
   {
    "mode": "k_glo",
    "gesture": "breathing",
    "action": "Available solo, unmute, MIDI Learn and internal-clock tap keys breathe until active.",
    "short_label": "MIX ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "610-627",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L610-L627"
     }
    ]
   },
   {
    "mode": "k_seq",
    "gesture": "breathing",
    "action": "The first six white keys mark usable sequence tools unless an arrangement is running.",
    "short_label": "SEQ TOOLS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_layer.c",
      "lines": "621-627",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L621-L627"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_tools.c",
      "lines": "14-25",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L14-L25"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/seq.c",
      "lines": "67",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L67"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Inactive keys follow DIM HI, DIM LO, OFF or INV, with shortcut maps using their own lights.",
    "short_label": "KEY GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "428-458",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L428-L458"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "flash",
    "action": "A clean boot can sweep the keys and buttons unless animation is disabled; an enabled idle animation starts after sixty quiet seconds.",
    "short_label": "ANIMATION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/main.c",
      "lines": "127-145",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L127-L145"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "310-332",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L310-L332"
     }
    ]
   },
   {
    "mode": "boot",
    "gesture": "flash",
    "short_label": "LOADER",
    "action": "During recovery, D4 and C♯5 flash three times briefly as the saved update loader takes over.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub.c",
      "lines": "178-188",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub.c#L178-L188"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub.c",
      "lines": "303-313",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub.c#L303-L313"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/hal/fm1_input.h",
      "lines": "149-156",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/hal/fm1_input.h#L149-L156"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "10-19",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L10-L19"
     }
    ]
   },
   {
    "mode": "boot",
    "gesture": "flash",
    "short_label": "USB RECOVERY",
    "action": "During recovery, D4 and C♯5 give one long flash before USB boot recovery when the saved loader is unusable or its handoff has already failed.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub.c",
      "lines": "178-188",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub.c#L178-L188"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/stub/stub.c",
      "lines": "303-313",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/stub/stub.c#L303-L313"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/hal/fm1_input.h",
      "lines": "149-156",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/hal/fm1_input.h#L149-L156"
     },
     {
      "kind": "source",
      "repo": "TheShrimpBlimp/pigeon",
      "ref": "v0.3.1",
      "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
      "path": "firmware/src/ui_input.c",
      "lines": "10-19",
      "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L10-L19"
     }
    ]
   }
  ]
 },
 "groups": {
  "key_lights": [
   "led_f3",
   "led_fs3",
   "led_g3",
   "led_gs3",
   "led_a3",
   "led_as3",
   "led_b3",
   "led_c4",
   "led_cs4",
   "led_d4",
   "led_ds4",
   "led_e4",
   "led_f4",
   "led_fs4",
   "led_g4",
   "led_gs4",
   "led_a4",
   "led_as4",
   "led_b4",
   "led_c5",
   "led_cs5",
   "led_d5",
   "led_ds5",
   "led_e5",
   "led_f5",
   "led_fs5",
   "led_g5"
  ]
 },
 "switching_note": {
  "kept_on_unit": "PIGEON stores four A–D projects, a last working session, preferences, and one shared bank for both songs and the drum kit, with separate chop and performance settings; this describes its saved work, not a promise that it survives installing another firmware. From the flash atlas: install/update using the incoming PIGEON loader: After validating chip key, whole package CRC and exact KOPOOL2/KOPOOL3 layout descriptors, erase/program only differing application sectors. Explicitly skip sample pool 60000-75FFF and 78000-91FFF. Invalidate recovery-marker sector first and write it last. Flash head 0000-3FFF and the remaining saved-data ranges are not program-write targets. No blanket saved-data erase is implemented by the PIGEON installer (an accepted incoming PIGEON package with both layout descriptors and valid marker). first and later application starts: conditional staging cleanup: Erase all five sectors only if the first 4 bytes or update-record first 8 bytes are nonblank and ota_staged does not recognize a whole own loader. With whole own loader retained, only the last E4000 sector may be erased for a leftover record outside loader bytes. No question. An E1000 journal alone does not trigger the probes (staging probes and own-loader recognition described above). first-start autosave after sampler setup: At first start from another firmware, the autosave baseline is taken before sampler tracks replace the initial synth setup. With RESTORE LAST on, the changed music is written after about 10 quiet seconds without an edit. An imported project is converted (see what PIGEON reads); a project it cannot read is replaced (RESTORE LAST is on; stopped, quiet working music for about 10 seconds). successful incoming-loader update-record cleanup: Conditional update-record cleanup only; no projects, sounds or samples are at risk from this cleanup. It is detail-only (After an install, erase only a 4 KiB sector whose last 256 bytes hold a valid update record (marker 0x5441 at +6 and a matching nonzero CRC16 over bytes 2..79): in practice the family's staging-record sector 0xE4000 and, on a first install from stock, stock's record sector 0xE8000. Saved music does not hold that record. This loader skips 0x97000-0xDFFFF and 0xEA000-0xFBFFF). What PIGEON writes over the previous firmware's data is in overwrites_previous; what the next firmware writes over PIGEON's is in when_you_leave.",
  "lost": "Replacing the audio bank changes what every saved phrase can play, and a damaged bank tail can make the complete bank unavailable on return; neither panel undo nor browser undo recovers overwritten device data. From the flash atlas: Other firmwares reading PIGEON's data: Felucca reads and uses PIGEON's preferences, MIDI LEARN and panel calibration; older user preset bank 1; older user preset bank 2; older FM6 patches for user presets; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format (These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices; Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question; Changing a sound or its format can make its separate patch unavailable; Only data in this sample slot is read. Other saved work is separate); Felucca lists PIGEON's saved pattern A; saved pattern B; saved pattern C; saved pattern D; last working session, but plays them differently (Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens); Felucca takes over PIGEON's older FM6 patch bank PIGEON no longer uses, converting them (If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format); Rainbow Mode takes over PIGEON's preferences, MIDI LEARN and panel calibration; older FM6 patch bank PIGEON no longer uses, converting them (These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices; If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format); Rainbow Mode reads and uses PIGEON's older user preset bank 1; older user preset bank 2; older FM6 patches for user presets; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format (Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question; Changing a sound or its format can make its separate patch unavailable; Only data in this sample slot is read. Other saved work is separate); Felucca [Salt] takes over PIGEON's preferences, MIDI LEARN and panel calibration, converting them (These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices); Felucca [Salt] reads and uses PIGEON's user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format (Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions); WaveLoop FM-1 reads and uses PIGEON's preferences, MIDI LEARN and panel calibration; older user preset bank 1; older user preset bank 2; older FM6 patches for user presets; user sample USR1 in the older format; user sample USR2 in the older format (These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices; Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question; Changing a sound or its format can make its separate patch unavailable; Only data in this sample slot is read. Other saved work is separate; Saved samples may have no slice positions set by you); WaveLoop FM-1 takes over PIGEON's older FM6 patch bank PIGEON no longer uses, converting them (If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format); SLOOP reads and uses PIGEON's user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it); SLOOP DX7 Banks reads and uses PIGEON's user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); SLOOP Floyd FM reads and uses PIGEON's user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); FM1 Quest reads and uses PIGEON's user sample USR1 in the older format (USR1 plays only if its audio and zones fit Quest’s 64 KiB slot. Sending into or erasing USR1 replaces it, including holding REC on a readable USR1 in IMPORTER. Sending into or erasing USR2 can damage the end of the old USR1. Extra slice markers are not used here); JIANT lists PIGEON's preferences, MIDI LEARN and panel calibration; older FM6 patches for user presets, but plays them differently (JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead); JIANT takes over PIGEON's older user preset bank 1; older user preset bank 2; older FM6 patch bank PIGEON no longer uses, converting them (JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept; Only patches linked to compatible FM6 user sounds are copied. The old bank stays available for PIGEON's backup export until JIANT's next FM6 save); ChoralRoot takes over PIGEON's preferences, MIDI LEARN and panel calibration; older FM6 patch bank PIGEON no longer uses, converting them (After ChoralRoot saves these settings, PIGEON cannot read the newer saved copy. It uses default preferences and panel calibration when you return; This applies only if the older 27-slot bank is still stored. A newer bank of FM6 patches in the same storage is separate and is not imported); ChoralRoot lists PIGEON's older user preset bank 1; older user preset bank 2, but plays them differently (Imported sounds may sound different, even if their names are kept. Confirming Flash Data erases the older banks they came from); GHOULBOX lists PIGEON's preferences, MIDI LEARN and panel calibration; older user preset bank 1; older user preset bank 2, but plays them differently; GHOULBOX takes over PIGEON's saved pattern A; saved pattern B; saved pattern C; saved pattern D; older FM6 patch bank PIGEON no longer uses; last working session, converting them; GHOULBOX reads and uses PIGEON's older FM6 patches for user presets; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format; fm1-chord takes over PIGEON's preferences, MIDI LEARN and panel calibration; older user preset bank 1; older user preset bank 2, converting them (Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered); fm1-chord reads and uses PIGEON's older FM6 patch bank PIGEON no longer uses; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format (Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored); MAKU reads and uses PIGEON's preferences, MIDI LEARN and panel calibration; older user preset bank 1; older user preset bank 2; older FM6 patches for user presets; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format (MAKU leaves these sample bytes in place, but its controls use built-in material; these uploaded samples are not available to play here); MAKU takes over PIGEON's older FM6 patch bank PIGEON no longer uses, converting them; Jangada reads and uses PIGEON's user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format (This applies only to older sample slots still stored on the FM-1. Pigeon’s current combined sample bank cannot be imported); Skiff lists PIGEON's older user preset bank 1; older user preset bank 2, but plays them differently (The same saved sound format does not guarantee the same sound or pattern playback); Skiff takes over PIGEON's older FM6 patch bank PIGEON no longer uses, converting them; Skiff reads and uses PIGEON's older FM6 patches for user presets; user sample USR1 in the older format; slice positions set by hand in the older format; user sample USR2 in the older format; user sample USR3 in the older format (A separate saved FM6 patch works only while its matching FM6 user sound is still stored; Skiff uses its own sound engines, so saved loops or slices can play differently; Saved slice points alone do not keep the sample they use); Hortator lists PIGEON's user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format, but plays them differently (Hortator uses its own one-shot sound engines, so saved loops and slices play differently); ORBIT takes over PIGEON's older user preset bank 1; older user preset bank 2, converting them (Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play); ORBIT reads and uses PIGEON's user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format (Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules); winampFM Synth reads and uses PIGEON's user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format (Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules); FM1 Move reads and uses PIGEON's user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format (Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules); X0X lists PIGEON's user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format, but plays them differently (Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used. This applies only to older separate sample slots that still exist. The current combined sample bank uses a different format); Jangada converts only older version 1 sounds in this group. Newer sound versions look empty, and saving anywhere in the group drops them from the rewritten group.; Skiff imports some settings and calibration, but can change and save the previous firmware’s preferences without asking. What PIGEON reads of other firmwares' data: PIGEON reads and uses Felucca's settings, button calibration, favourites, MIDI LEARN map; user sample slot USR1; user sample slot USR2; user sample slot USR3 (Shared preferences can mean different things. Choices this firmware cannot use are changed to ones it supports; Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same; Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio); PIGEON takes over Felucca's project slot A; project slot B; project slot C; project slot D; autosave (the music as you left it), converting them (Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup); PIGEON reads and uses SLOOP's user sample slot USR1; user sample slot USR2; user sample slot USR3 (Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same); PIGEON reads and uses X0X's break loops slot 1; break loops slot 2; break loops slot 3 (Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same); PIGEON reads and uses JIANT's settings, calibration, favourites, MENU options (Shared preferences can mean different things. Choices this firmware cannot use are changed to ones it supports); PIGEON reads and uses GHOULBOX's settings and panel calibration; user sample slot USR1; user sample slot USR2; user sample slot USR3 (Shared preferences can mean different things. Choices this firmware cannot use are changed to ones it supports; Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same; Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio); PIGEON takes over Hortator's settings and panel calibration, converting them (Only some settings are changed to the new format. Your songs are not stored in these settings. Switching back may lose settings); PIGEON reads and uses Hortator's user samples USR1; user samples USR2; user samples USR3 (Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same); PIGEON reads and uses Skiff's settings, calibration and favourites; user sample USR1; user sample USR2; user sample USR3 (Shared preferences can mean different things. Choices this firmware cannot use are changed to ones it supports; Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same); PIGEON reads and uses Rainbow Mode's Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE (calibration and shared preferences can still be read, but the WRITE song is not kept; Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same; Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio); PIGEON takes over Rainbow Mode's Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; last session in the full version of Felucca, converting them (Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup); PIGEON reads and uses MAKU's settings and calibration; inherited user sample 1; inherited user sample 2; inherited user sample 3 (Some saved preferences mean different things in PIGEON. For choices PIGEON cannot use, it uses settings it supports; Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same); PIGEON takes over MAKU's inherited project A; inherited project B; inherited project C; inherited project D, converting them (Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup); PIGEON reads and uses fm1-chord's uploaded sample USR1 and optional SLICE markers; uploaded sample USR2 and optional SLICE markers; uploaded sample USR3 and optional SLICE markers (Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same; Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio); PIGEON reads and uses SLOOP DX7 Banks's user sample USR1; user sample USR2; user sample USR3 (Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same); PIGEON reads and uses Jangada's user samples USR1; user samples USR2; user samples USR3 (Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same); PIGEON reads and uses WaveLoop FM-1's settings, calibration and favourites; user sample USR1; user sample USR2 (Shared preferences can mean different things. Choices this firmware cannot use are changed to ones it supports; Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same); PIGEON takes over WaveLoop FM-1's song 1; song 2; song 3; last session saved for the next start, converting them (Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup); PIGEON reads and uses ORBIT's sample slot USR1; sample slot USR2; sample slot USR3 (Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same); PIGEON reads and uses SLOOP Floyd FM's user sample slot USR1; user sample slot USR2; user sample slot USR3 (Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same); PIGEON reads and uses winampFM Synth's sample USR1; sample USR2; sample USR3 (Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same); PIGEON takes over Felucca [Salt]'s project 1; project 2; project 3; project 4, converting them (Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup); PIGEON reads and uses Felucca [Salt]'s user sample USR1; user sample USR2; user sample USR3 (Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same); PIGEON reads and uses FM1 Move's sample slot USR1; sample slot USR2; sample slot USR3 (Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same); PIGEON reads and uses FM1 Quest's sample USR1 (Only sample slots that start in the same place in storage can be read. Other small sample slots are not moved to matching slots). Everything else of another firmware's looks empty or foreign to the reader.",
  "back_up_first": "Choose Read device bank to read the FM-1’s audio and chop settings, then Save bank to download that local copy; choose Back up full session to read the connected unit and download its current music, saved A–D projects, preferences, supported inherited sound banks, samples and chop settings.",
  "source": [
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_store.c",
    "lines": "5-28",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_store.c#L5-L28"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_store.c",
    "lines": "50-74",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_store.c#L50-L74"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_store.c",
    "lines": "131-142",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_store.c#L131-L142"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_bank_editor.c",
    "lines": "47-110",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_bank_editor.c#L47-L110"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/editor_backup.c",
    "lines": "11-75",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/editor_backup.c#L11-L75"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/editor_backup.c",
    "lines": "106-189",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/editor_backup.c#L106-L189"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "web/pigeon/device.js",
    "lines": "91-228",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/web/pigeon/device.js#L91-L228"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "web/pigeon/app.js",
    "lines": "679-746",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/web/pigeon/app.js#L679-L746"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "web/pigeon/app.js",
    "lines": "871-895",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/web/pigeon/app.js#L871-L895"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/main.c",
    "lines": "151-156",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L151-L156"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/main.c",
    "lines": "189-198",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/main.c#L189-L198"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_ui.c",
    "lines": "56-84",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L56-L84"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/project.c",
    "lines": "1176-1231",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/project.c#L1176-L1231"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/project.c",
    "lines": "1288-1340",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/project.c#L1288-L1340"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_menu.c",
    "lines": "515-520",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_menu.c#L515-L520"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_layer.c",
    "lines": "167-174",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L167-L174"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ota.c",
    "lines": "433-452",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ota.c#L433-L452"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/loader/ldr_core.c",
    "lines": "183-245",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/loader/ldr_core.c#L183-L245"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/loader/ldr_core.c",
    "lines": "250-265",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/loader/ldr_core.c#L250-L265"
   },
   {
    "kind": "doc",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "docs/PIGEON_V031_RELEASE.md",
    "lines": "13-15",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/docs/PIGEON_V031_RELEASE.md#L13-L15"
   },
   {
    "kind": "doc",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "docs/KO_MODE.md",
    "lines": "9-18",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/docs/KO_MODE.md#L9-L18"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/hal/ko_layout.h",
    "lines": "7-20",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/hal/ko_layout.h#L7-L20"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/hal/ko_layout.h",
    "lines": "28-41",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/hal/ko_layout.h#L28-L41"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/loader/ldr_core.c",
    "lines": "205-217",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/loader/ldr_core.c#L205-L217"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_bank.c",
    "lines": "128-158",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_bank.c#L128-L158"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "web/pigeon/index.html",
    "lines": "53-58",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/web/pigeon/index.html#L53-L58"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "web/pigeon/app.js",
    "lines": "722-733",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/web/pigeon/app.js#L722-L733"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/project.c",
    "lines": "1186-1210",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/project.c#L1186-L1210"
   }
  ],
  "storage_evidence": "Source-defined write locations and triggers; cross-firmware losses inferred from the supplied atlas and checked fragments, not hardware-tested.",
  "backup_limits": "A .kob file holds the encoded audio and optional chop/performance settings, but no current music, saved A–D projects or device preferences; a captured .pigeon session includes those, plus supported inherited user-sound banks, but excludes the separate FM6 voice bank, raw last-session copy, update recovery data and unrecognized foreign work.",
  "legacy_backup": "PIGEON’s full-session capture requires a readable shared bank and cannot capture the older separate Felucca-family sample slots before migration; back those up with their original firmware’s compatible tool before sending the first PIGEON bank.",
  "transfers": "Opening audio or an archive, editing it, using browser undo, applying a local song, or loading a browser library entry changes the local workspace only; Send bank asks once, then immediately replaces the device bank without automatically capturing a recovery session, while Restore session asks and first captures a recovery session, then replaces audio, supplied chop settings, saved objects and settings in separate commits that can leave a partial restore if interrupted.",
  "restore_limits": "Restoring a session also restores empty saved slots from the archive, replacing data already there; its current music first returns to memory and may persist through ordinary autosave later, while undo in the browser cannot reverse a device transfer.",
  "no_metadata": "Sending a bank without the optional chop-settings tail can leave the old chop-settings sector in place, but only settings whose stored audio fingerprints match can apply to the replacement audio.",
  "downgrade": "Back up a bank and a full session before going back a version; the loader can refuse a standard-layout firmware while a PIGEON bank header remains, or an older smaller-capacity release when the bank is too large, so erase the bank headers with the bank tool (tools/ko_bank.py erase) when required after backing up, knowing that this invalidates the bank without securely removing its audio; older one-song releases need a matching one-song bank, and v0.3.1 keeps v0.3’s formats.",
  "startup_overwrites": "Before PIGEON’s first start, back up using the firmware that made the work. With RESTORE LAST on, initial sampler setup can lead to a save after ten quiet seconds without an owner edit or question, using the autosave area. See the switching advice in this section for the affected saved work.",
  "settings_overwrites": "Closing Settings, first opening GLO or SEQ shortcuts, learning or clearing MIDI controls, or sending preferences from an editor can replace the preference area without asking; even a first unedited Settings close can write. See the switching advice in this section for the affected saved work.",
  "other_settings": "A surviving alternate copy is not a backup: later writes can replace it too, and returning to a firmware that rejects the replacement may reset or ignore its saved work.",
  "update_overwrites": "At start-up, occupied update probes can cause the update area to be erased without asking unless a complete recognized recovery loader can be retained. X0X and Polly restore information alone does not trigger it, but is lost when the probes do trigger cleanup. See the switching advice in this section for the affected saved work.",
  "install_overwrites": "PIGEON’s own compatible installer skips its expanded sample areas and has no blanket saved-data erase option. See the switching advice in this section for the affected saved work. After installation, its update-record cleanup erases only a sector holding a valid update record; saved projects, sounds and samples are not update records.",
  "bank_overwrites": "After its confirmation, Send bank to FM1 invalidates the old bank immediately, then writes only the audio space needed by the incoming size and any supplied chop settings, without a further question or device undo. See the switching advice in this section for the affected saved work. The library tool (tools/pigeon_library.py) has upload and restore commands that use the same bank writes without a device or computer question; each first saves a recovery file and stops before writing if the existing bank cannot be read. Restore then writes the archive’s saved projects, older user preset banks, older FM6 patches and preferences, including empty saved slots, and returns its current music to memory for later autosave.",
  "pattern_overwrites": "SAVE, paste and duplicate into A–D write the selected project area immediately while stopped and silent, without an overwrite question or flash undo. See the switching advice in this section for the affected saved work.",
  "foreign_reading": "PIGEON can read compatible older Felucca-family settings and projects, and separate sample slots including X0X break loops, but it changes incompatible instrument sources to sampler tracks and does not preserve the original synthesizer performance; most other firmware data is rejected rather than converted, and a rejected slot is not protected from later writes.",
  "when_you_leave": [
   {
    "to": "stock",
    "name": "Stock V15",
    "flags": "S?",
    "weakest_grade": "reported",
    "at_risk": [
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Stock V15",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [
     "saved pattern A",
     "saved pattern B",
     "saved pattern C",
     "saved pattern D",
     "the older FM6 patch bank PIGEON no longer uses",
     "older FM6 patches for user presets",
     "slice positions set by hand in the older format",
     "user sample USR1 in the older format",
     "chops, drum-pad and performance edits",
     "user sample USR2 in the older format",
     "user sample USR3 in the older format",
     "older user preset bank 1",
     "older user preset bank 2",
     "last working session"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "If your PIGEON sample bank reaches storage written over when you install Stock V15, PIGEON will reject the whole bank, both songs and the kit. Export the PIGEON session and audio bank before switching. Stock is reported to store its own data where the bank starts, so export the bank whatever its size."
    ],
    "owner_text": "At risk when you act: shared song and drum sample bank. Possibly at risk (layout reported or inferred): saved pattern A; saved pattern B; saved pattern C; saved pattern D; the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; slice positions set by hand in the older format; user sample USR1 in the older format; chops, drum-pad and performance edits; user sample USR2 in the older format; user sample USR3 in the older format; older user preset bank 1; older user preset bank 2; last working session. If your PIGEON sample bank reaches storage written over when you install Stock V15, PIGEON will reject the whole bank, both songs and the kit. Export the PIGEON session and audio bank before switching. Stock is reported to store its own data where the bank starts, so export the bank whatever its size.",
    "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": [
     "saved pattern A",
     "saved pattern B",
     "saved pattern C",
     "saved pattern D",
     "the older FM6 patch bank PIGEON no longer uses",
     "older FM6 patches for user presets",
     "slice positions set by hand in the older format",
     "shared song and drum sample bank",
     "user sample USR1 in the older format",
     "chops, drum-pad and performance edits",
     "user sample USR2 in the older format",
     "user sample USR3 in the older format",
     "older user preset bank 1",
     "older user preset bank 2",
     "last working session"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): saved pattern A; saved pattern B; saved pattern C; saved pattern D; the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; slice positions set by hand in the older format; shared song and drum sample bank; user sample USR1 in the older format; chops, drum-pad and performance edits; user sample USR2 in the older format; user sample USR3 in the older format; older user preset bank 1; older user preset bank 2; last working session.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "felucca",
    "name": "Felucca",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its RESTORE LAST is on by default)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "kept: Felucca can read it"
       },
       {
        "way": "automatically, only if beta 2ND CORE is on and a sound calculation fails or takes too long",
        "effect": "kept: Felucca can read it"
       },
       {
        "way": "when you change settings from the editor (without asking)",
        "effect": "kept: Felucca can read it"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "kept: Felucca can read it"
       },
       {
        "way": "when you learn MIDI CC assignments (without asking)",
        "effect": "kept: Felucca can read it"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "kept: Felucca can read it"
       }
      ]
     },
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no valid current bank of FM6 patches for your sounds",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no valid current bank of FM6 patches for your sounds",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you change slice positions in SLICE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you install Felucca",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you change slice positions in SLICE (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you change slice positions in SLICE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you rename a slot (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you rename a slot (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you rename a slot (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you rename a slot (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you change slice positions in SLICE (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you change slice positions in SLICE (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you change slice positions in SLICE (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a slot (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a slot (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Shared settings supply the RESTORE LAST choice. OFF stops automatic saving here. Preferences you save can change this. Otherwise, music is saved automatically after edits and a wait with playback stopped, no held keys or buttons and no sound.",
     "Shared settings can keep beta 2ND CORE turned on from an earlier Felucca session. If a sound calculation fails or takes too long, settings may be saved later.",
     "Felucca reads saved pattern A until you write over the saved data. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens.",
     "Felucca reads saved pattern B until you write over the saved data. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens.",
     "Felucca reads saved pattern C until you write over the saved data. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens.",
     "Felucca reads saved pattern D until you write over the saved data. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens.",
     "Felucca reads older FM6 patches for user presets until you write over the saved data. Changing a sound or its format can make its separate patch unavailable.",
     "Felucca reads user sample USR1 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Felucca reads user sample USR2 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Felucca reads user sample USR3 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Felucca reads older user preset bank 1 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question.",
     "Felucca reads older user preset bank 2 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question.",
     "Felucca reads last working session until you write over the saved data. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens.",
     "Felucca reads preferences, MIDI LEARN and panel calibration until you write over the saved data. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices."
    ],
    "owner_text": "At risk by itself: last working session; preferences, MIDI LEARN and panel calibration. At risk by itself, under a condition: the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets. At risk when you act: shared song and drum sample bank; slice positions set by hand in the older format; chops, drum-pad and performance edits; saved pattern A; saved pattern B; saved pattern C; saved pattern D; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format; older user preset bank 1; older user preset bank 2. Shared settings supply the RESTORE LAST choice. OFF stops automatic saving here. Preferences you save can change this. Otherwise, music is saved automatically after edits and a wait with playback stopped, no held keys or buttons and no sound. Shared settings can keep beta 2ND CORE turned on from an earlier Felucca session. If a sound calculation fails or takes too long, settings may be saved later. Felucca reads saved pattern A until you write over the saved data. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. Felucca reads saved pattern B until you write over the saved data. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. Felucca reads saved pattern C until you write over the saved data. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. Felucca reads saved pattern D until you write over the saved data. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. Felucca reads older FM6 patches for user presets until you write over the saved data. Changing a sound or its format can make its separate patch unavailable. Felucca reads user sample USR1 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Felucca reads user sample USR2 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Felucca reads user sample USR3 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Felucca reads older user preset bank 1 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Felucca reads older user preset bank 2 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Felucca reads last working session until you write over the saved data. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. Felucca reads preferences, MIDI LEARN and panel calibration until you write over the saved data. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "sloop",
    "name": "SLOOP",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start an update or enter UPDATE MODE",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start an update or enter UPDATE MODE",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if SLOOP can still read older SLOOP settings with default MIDI controls and older working music whose drum MIDI channel differs from those settings (PIGEON’s own settings cannot trigger this update)",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save drum kits from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you install SLOOP",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold SAVE and press white key 5–8 to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section from the web editor LIVE page (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold SAVE and press white key 5–8 to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section from the web editor LIVE page (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold SAVE and press white key 5–8 to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section from the web editor LIVE page (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold SAVE and press white key 5–8 to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section from the web editor LIVE page (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save selected DX7 voices from the editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 bank patch from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you save selected DX7 voices from the editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you save selected DX7 voices from the editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "SLOOP reads user sample USR1 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it.",
     "SLOOP reads user sample USR2 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it.",
     "SLOOP reads user sample USR3 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it.",
     "SLOOP keeps stored but does not show older user preset bank 1 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
     "SLOOP keeps stored but does not show older user preset bank 2 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound."
    ],
    "owner_text": "At risk by itself: the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; preferences, MIDI LEARN and panel calibration. At risk when you act: shared song and drum sample bank; saved pattern A; saved pattern B; saved pattern C; saved pattern D; slice positions set by hand in the older format; chops, drum-pad and performance edits; last working session; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format; older user preset bank 1; older user preset bank 2. SLOOP reads user sample USR1 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. SLOOP reads user sample USR2 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. SLOOP reads user sample USR3 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. SLOOP keeps stored but does not show older user preset bank 1 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound. SLOOP keeps stored but does not show older user preset bank 2 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "x0x",
    "name": "X0X",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if X0X crashed while 2ND CORE was on and then restarted without being switched off",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install X0X",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "If your PIGEON sample bank reaches the storage that installing X0X writes over, PIGEON can no longer read any of the bank, either song or the kit. Export the PIGEON session and audio bank before switching.",
     "After you confirm a restore on the computer, X0X starts erasing before asking again on the FM-1. Saying no keeps X0X’s current project but does not bring back erased data from your previous firmware, even if the computer says nothing changed.",
     "X0X reads user sample USR1 in the older format until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used. This applies only to older separate sample slots that still exist. The current combined sample bank uses a different format.",
     "X0X reads user sample USR2 in the older format until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used. This applies only to older separate sample slots that still exist. The current combined sample bank uses a different format.",
     "X0X reads user sample USR3 in the older format until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used. This applies only to older separate sample slots that still exist. The current combined sample bank uses a different format."
    ],
    "owner_text": "At risk by itself: saved pattern A; saved pattern B; saved pattern C; saved pattern D; older user preset bank 2; preferences, MIDI LEARN and panel calibration. At risk when you act: shared song and drum sample bank; slice positions set by hand in the older format; chops, drum-pad and performance edits; older user preset bank 1; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format. If your PIGEON sample bank reaches the storage that installing X0X writes over, PIGEON can no longer read any of the bank, either song or the kit. Export the PIGEON session and audio bank before switching. After you confirm a restore on the computer, X0X starts erasing before asking again on the FM-1. Saying no keeps X0X’s current project but does not bring back erased data from your previous firmware, even if the computer says nothing changed. X0X reads user sample USR1 in the older format until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used. This applies only to older separate sample slots that still exist. The current combined sample bank uses a different format. X0X reads user sample USR2 in the older format until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used. This applies only to older separate sample slots that still exist. The current combined sample bank uses a different format. X0X reads user sample USR3 in the older format until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used. This applies only to older separate sample slots that still exist. The current combined sample bank uses a different format.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "jiant",
    "name": "JIANT",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you install JIANT",
        "effect": "lost"
       },
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you select a song using MIDI PROGRAM CHANGE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you switch song or project (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you select a song using MIDI PROGRAM CHANGE (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you switch song or project (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "automatically, only if the shared preferences it reads still need JIANT’s first-start update",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "when you change settings from the web editor (without asking)",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "when you mark a favourite with a star (without asking)",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if no readable bank of FM6 patches for your sounds survives and the older 27-voice FM6 bank is present",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you erase a slot (asks for that slot only: press again to confirm; writes the whole bank) [uses its associated sound bank]",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank) [uses its associated sound bank]",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you rename a slot (without asking; writes the whole bank) [uses its associated sound bank]",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank) [uses its associated sound bank]",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank) [uses its associated sound bank]",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you send an FM6 user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you store the current FM6 sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank) [uses its associated sound bank]",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       }
      ]
     },
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if the shared choices it reads, or your later choice, turn JIANT’s RESTORE LAST on",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if no readable bank of FM6 patches for your sounds survives and the older 27-voice FM6 bank is present",
        "effect": "kept for PIGEON to export: JIANT copies only the patches your compatible FM6 user sounds use; the old bank stays until JIANT's next FM6 save"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project",
        "effect": "partly lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you rename a slot (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you rename a slot (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "If RESTORE LAST was OFF before switching, it becomes ON in JIANT. The previous firmware’s default ON becomes OFF.",
     "JIANT copies only the patches your compatible FM6 user sounds use at first start. The old bank stays available for PIGEON's backup export until JIANT's next FM6 save."
    ],
    "owner_text": "At risk by itself: shared song and drum sample bank; user sample USR3 in the older format; preferences, MIDI LEARN and panel calibration. At risk by itself, under a condition: older FM6 patches for user presets; last working session; the older FM6 patch bank PIGEON no longer uses. At risk when you act: saved pattern A; saved pattern B; saved pattern C; saved pattern D; user sample USR1 in the older format; slice positions set by hand in the older format; chops, drum-pad and performance edits; user sample USR2 in the older format; older user preset bank 1; older user preset bank 2. If RESTORE LAST was OFF before switching, it becomes ON in JIANT. The previous firmware’s default ON becomes OFF. JIANT copies only the patches your compatible FM6 user sounds use at first start. The old bank stays available for PIGEON's backup export until JIANT's next FM6 save.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "melodee",
    "name": "Melodee",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting on the panel or in the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change settings from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you mark a favourite with a star (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you install Melodee",
        "effect": "lost"
       },
       {
        "way": "when you quick-save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "partly lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "partly lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "partly lost"
       },
       {
        "way": "when you import SysEx sound data into slots",
        "effect": "partly lost"
       },
       {
        "way": "when you quick-save a project (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project",
        "effect": "partly lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you save a user preset",
        "effect": "partly lost"
       },
       {
        "way": "when you send a user sound from the web editor",
        "effect": "partly lost"
       },
       {
        "way": "when you store the current sound from the web editor",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "At first start, Melodee replaces unreadable settings and any matching sound banks it cannot read, without asking."
    ],
    "owner_text": "At risk by itself: the older FM6 patch bank PIGEON no longer uses; older user preset bank 1; older user preset bank 2; preferences, MIDI LEARN and panel calibration. At risk by itself, under a condition: shared song and drum sample bank; saved pattern A; saved pattern B; saved pattern C; saved pattern D; older FM6 patches for user presets; slice positions set by hand in the older format; user sample USR3 in the older format; last working session. At risk when you act: user sample USR1 in the older format; chops, drum-pad and performance edits; user sample USR2 in the older format. At first start, Melodee replaces unreadable settings and any matching sound banks it cannot read, without asking.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fomni",
    "name": "FoMni",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FoMni",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "If your PIGEON sample bank reaches the storage that installing FoMni writes over, PIGEON can no longer read any of the bank, either song or the kit. Export the PIGEON session and audio bank before switching."
    ],
    "owner_text": "At risk by itself: preferences, MIDI LEARN and panel calibration. At risk when you act: shared song and drum sample bank; older user preset bank 1. If your PIGEON sample bank reaches the storage that installing FoMni writes over, PIGEON can no longer read any of the bank, either song or the kit. Export the PIGEON session and audio bank before switching.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "amb",
    "name": "AMB-1",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install AMB-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: preferences, MIDI LEARN and panel calibration. At risk when you act: shared song and drum sample bank; older user preset bank 1.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "choralroot",
    "name": "ChoralRoot",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if an older ChoralRoot favourites save is still stored and the space for its next save still contains data",
        "effect": "lost"
       },
       {
        "way": "automatically, only if an older ChoralRoot session save is still stored and the space for its next save still contains data",
        "effect": "lost"
       },
       {
        "way": "automatically, only if an older ChoralRoot sound collection is still saved and the space for its next save still contains data",
        "effect": "lost"
       },
       {
        "way": "automatically, only if the space for its next save still needs clearing after a save or a failed start-up cleanup",
        "effect": "lost"
       },
       {
        "way": "automatically, only if there is no saved sound collection and at least one supported older user sound can be read",
        "effect": "lost"
       },
       {
        "way": "when you choose Import 0.21 sounds from the device manager (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you choose Overwrite or Save as new and press OCT+ or SAVE (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you choose Place all from the device manager (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you choose Undo from the device manager (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose a voice from a DX7 or CZ bank on the installer page and import it (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm deletion or reset with OCT+ (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you delete a sound from the installer page (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you delete a sound with the computer question skipped (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you delete a sound with the computer tool (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you delete all user sounds or reset sounds to factory defaults from the device manager (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you delete selected sounds from the device manager (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE after recording, editing or clearing this loop (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE for a global save (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you import a Digitone sound from the installer page (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you import a sound file or one DX7 or CZ voice from the installer page (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you import a sound or a DX7 or CZ voice with the computer question skipped (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you import a sound or a DX7 or CZ voice with the computer tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you install ChoralRoot",
        "effect": "lost"
       },
       {
        "way": "when you keep calibration or enter update mode by holding OCT- + OCT+ + HOME for 5 s (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you move or swap sounds from the device manager (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you place a loop from the device manager (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you place a sound as new or back in its saved factory position from the device manager (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you place several selected sounds from the device manager (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC in Advance mode when the current loop is not empty (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a sound from the device manager and enter its new name (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you rename a sound from the installer page and enter its new name (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you rename a sound with the computer tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you replace a selected user sound from the device manager (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you replace factory sounds from the device manager (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore factory order from the device manager (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore factory presets from the device manager (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore favourite marks from the computer (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore favourite marks with the computer question skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you swap loop slots from the device manager (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "partly lost"
       },
       {
        "way": "automatically, only if an older ChoralRoot session save is still stored and the space for its next save still contains data",
        "effect": "partly lost"
       },
       {
        "way": "automatically, only if an older ChoralRoot sound collection is still saved and the space for its next save still contains data",
        "effect": "partly lost"
       },
       {
        "way": "automatically, only if the space for its next save still needs clearing after a save or a failed start-up cleanup",
        "effect": "partly lost"
       },
       {
        "way": "automatically, only if this space will hold its next save and still contains data",
        "effect": "partly lost"
       },
       {
        "way": "when you choose Import 0.21 sounds from the device manager (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you choose Overwrite or Save as new and press OCT+ or SAVE (without asking; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you choose Place all from the device manager (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you choose Undo from the device manager (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you choose a voice from a DX7 or CZ bank on the installer page and import it (without asking; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (asks first: press again to confirm)",
        "effect": "partly lost"
       },
       {
        "way": "when you confirm deletion or reset with OCT+ (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you delete a sound from the installer page (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you delete a sound with the computer question skipped (without asking; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you delete a sound with the computer tool (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you delete all user sounds or reset sounds to factory defaults from the device manager (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you delete selected sounds from the device manager (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you hold SAVE after recording, editing or clearing this loop (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you hold SAVE for a global save (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you import a Digitone sound from the installer page (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you import a sound file or one DX7 or CZ voice from the installer page (without asking; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you import a sound or a DX7 or CZ voice with the computer question skipped (without asking; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you import a sound or a DX7 or CZ voice with the computer tool (without asking; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you move or swap sounds from the device manager (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you place a loop from the device manager",
        "effect": "partly lost"
       },
       {
        "way": "when you place a sound as new or back in its saved factory position from the device manager (without asking; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you place several selected sounds from the device manager (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you press REC in Advance mode when the current loop is not empty (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you rename a sound from the device manager and enter its new name (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you rename a sound from the installer page and enter its new name (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you rename a sound with the computer tool (without asking; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you replace a selected user sound from the device manager (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you replace factory sounds from the device manager (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore factory order from the device manager (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore factory presets from the device manager (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you swap loop slots from the device manager (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only if an older ChoralRoot favourites save is still stored and the space for its next save still contains data",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only if an older ChoralRoot session save is still stored and the space for its next save still contains data",
        "effect": "lost"
       },
       {
        "way": "automatically, only if an older ChoralRoot sound collection is still saved and the space for its next save still contains data",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only if the space for its next save still needs clearing after a save or a failed start-up cleanup",
        "effect": "lost"
       },
       {
        "way": "automatically, only if there is no saved sound collection and at least one supported older user sound can be read",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you choose Import 0.21 sounds from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you choose Overwrite or Save as new and press OCT+ or SAVE (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you choose Place all from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you choose Undo from the device manager (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you choose a voice from a DX7 or CZ bank on the installer page and import it (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm deletion or reset with OCT+ (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you delete a sound from the installer page (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you delete a sound with the computer question skipped (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you delete a sound with the computer tool (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you delete all user sounds or reset sounds to factory defaults from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you delete selected sounds from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you hold SAVE for a global save (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you import a Digitone sound from the installer page (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you import a sound file or one DX7 or CZ voice from the installer page (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you import a sound or a DX7 or CZ voice with the computer question skipped (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you import a sound or a DX7 or CZ voice with the computer tool (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you keep calibration or enter update mode by holding OCT- + OCT+ + HOME for 5 s (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you move or swap sounds from the device manager (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you place a sound as new or back in its saved factory position from the device manager (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you place several selected sounds from the device manager (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you rename a sound from the device manager and enter its new name (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you rename a sound from the installer page and enter its new name (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you rename a sound with the computer tool (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you replace a selected user sound from the device manager (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you replace factory sounds from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore factory order from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore factory presets from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore favourite marks from the computer (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore favourite marks with the computer question skipped (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose Undo from the device manager (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE after recording, editing or clearing this loop (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you place a loop from the device manager (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC in Advance mode when the current loop is not empty (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you swap loop slots from the device manager (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: After ChoralRoot saves these settings, PIGEON cannot read the newer saved copy. It uses default preferences and panel calibration when you return"
       },
       {
        "way": "automatically, only if a processor failure blocked Dual Core while its saved setting was On",
        "effect": "changed to the new format: After ChoralRoot saves these settings, PIGEON cannot read the newer saved copy. It uses default preferences and panel calibration when you return"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (asks first: press again to confirm)",
        "effect": "changed to the new format: After ChoralRoot saves these settings, PIGEON cannot read the newer saved copy. It uses default preferences and panel calibration when you return"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (without asking)",
        "effect": "changed to the new format: After ChoralRoot saves these settings, PIGEON cannot read the newer saved copy. It uses default preferences and panel calibration when you return"
       },
       {
        "way": "when you hold SAVE for a global save (without asking)",
        "effect": "changed to the new format: After ChoralRoot saves these settings, PIGEON cannot read the newer saved copy. It uses default preferences and panel calibration when you return"
       },
       {
        "way": "when you keep calibration or enter update mode by holding OCT- + OCT+ + HOME for 5 s (without asking)",
        "effect": "changed to the new format: After ChoralRoot saves these settings, PIGEON cannot read the newer saved copy. It uses default preferences and panel calibration when you return"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a DX7 bank (without asking)",
        "effect": "changed to the new format: Once ChoralRoot saves its FM6 bank, your previous firmware cannot read the new bank. It does not try the older saved copy just because the newest bank uses a different patch format. This applies only if the older 27-slot bank is still stored. A newer bank of FM6 patches in the same storage is separate and is not imported"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a DX7 bank (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "At first normal start, before you save, ChoralRoot can clear storage to make room and copy supported older sounds into its sound storage. Imported sounds can play differently.",
     "ChoralRoot reads older user preset bank 1 until you write over the saved data. Imported sounds may sound different, even if their names are kept. Confirming Flash Data erases the older banks they came from.",
     "ChoralRoot reads older user preset bank 2 until you write over the saved data. Imported sounds may sound different, even if their names are kept. Confirming Flash Data erases the older banks they came from."
    ],
    "owner_text": "At risk by itself: shared song and drum sample bank; slice positions set by hand in the older format; user sample USR2 in the older format; user sample USR3 in the older format; preferences, MIDI LEARN and panel calibration. At risk when you act: saved pattern A; saved pattern B; saved pattern C; saved pattern D; the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; user sample USR1 in the older format; chops, drum-pad and performance edits; older user preset bank 1; older user preset bank 2. At first normal start, before you save, ChoralRoot can clear storage to make room and copy supported older sounds into its sound storage. Imported sounds can play differently. ChoralRoot reads older user preset bank 1 until you write over the saved data. Imported sounds may sound different, even if their names are kept. Confirming Flash Data erases the older banks they came from. ChoralRoot reads older user preset bank 2 until you write over the saved data. Imported sounds may sound different, even if their names are kept. Confirming Flash Data erases the older banks they came from.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "ghoulbox",
    "name": "GHOULBOX",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "changed to the new format: Only patches used by compatible user sounds change to the new format. Later saves take turns writing over the old bank’s two saved copies with the new bank of FM6 patches for your sounds. Back up the old bank before switching"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Only patches used by compatible user sounds change to the new format. Later saves take turns writing over the old bank’s two saved copies with the new bank of FM6 patches for your sounds. Back up the old bank before switching"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Only patches used by compatible user sounds change to the new format. Later saves take turns writing over the old bank’s two saved copies with the new bank of FM6 patches for your sounds. Back up the old bank before switching"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Only patches used by compatible user sounds change to the new format. Later saves take turns writing over the old bank’s two saved copies with the new bank of FM6 patches for your sounds. Back up the old bank before switching"
       }
      ]
     },
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its RESTORE LAST is on by default)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you send an FM6 voice bank with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "when you change settings from the web editor (without asking)",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if no readable bank of FM6 patches for your sounds survives and the older 27-voice FM6 bank is present",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you install GHOULBOX",
        "effect": "lost"
       },
       {
        "way": "when you leave SLICES after editing slice positions set by hand (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you leave SLICES after editing slice positions set by hand (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the web editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you leave SLICES after editing slice positions set by hand (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you leave SLICES after editing slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you leave SLICES after editing slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you leave SLICES after editing slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "RESTORE LAST starts ON with the previous firmware’s fresh settings. Shared choices it reads can leave it OFF. A saved LOW click level skips the final change to ON. If CLICK was OFF or REC, an earlier change turns RESTORE LAST OFF. With CLICK ON, the previous RESTORE LAST choice stays.",
     "GHOULBOX reads older FM6 patches for user presets until you write over the saved data.",
     "GHOULBOX reads user sample USR1 in the older format until you write over the saved data.",
     "GHOULBOX reads user sample USR2 in the older format until you write over the saved data.",
     "GHOULBOX reads user sample USR3 in the older format until you write over the saved data."
    ],
    "owner_text": "At risk by itself: the older FM6 patch bank PIGEON no longer uses; last working session; preferences, MIDI LEARN and panel calibration. At risk by itself, under a condition: older FM6 patches for user presets. At risk when you act: shared song and drum sample bank; saved pattern A; saved pattern B; saved pattern C; saved pattern D; slice positions set by hand in the older format; chops, drum-pad and performance edits; older user preset bank 1; older user preset bank 2; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format. RESTORE LAST starts ON with the previous firmware’s fresh settings. Shared choices it reads can leave it OFF. A saved LOW click level skips the final change to ON. If CLICK was OFF or REC, an earlier change turns RESTORE LAST OFF. With CLICK ON, the previous RESTORE LAST choice stays. GHOULBOX reads older FM6 patches for user presets until you write over the saved data. GHOULBOX reads user sample USR1 in the older format until you write over the saved data. GHOULBOX reads user sample USR2 in the older format until you write over the saved data. GHOULBOX reads user sample USR3 in the older format until you write over the saved data.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if Workbench has just installed Open and Open reports no sample bank it can recognize",
        "effect": "lost"
       },
       {
        "way": "when you choose USER 1 instead of the remembered USER slot, then press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose USER 2 instead of the remembered USER slot, then press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose USER 3 instead of the remembered USER slot, then press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose USER 4 instead of the remembered USER slot, then press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose USER 5 instead of the remembered USER slot, then press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose USER 6 instead of the remembered USER slot, then press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose USER 7 instead of the remembered USER slot, then press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose USER 8 instead of the remembered USER slot, then press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose USER 9 instead of the remembered USER slot, then press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose USER 10 instead of the remembered USER slot, then press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose USER 11 instead of the remembered USER slot, then press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose USER 12 instead of the remembered USER slot, then press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose USER 13 instead of the remembered USER slot, then press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose USER 14 instead of the remembered USER slot, then press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose USER 15 instead of the remembered USER slot, then press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose USER 16 instead of the remembered USER slot, then press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm USER 1 in the Workbench save dialog (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm USER 2 in the Workbench save dialog (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm USER 3 in the Workbench save dialog (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm USER 4 in the Workbench save dialog (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm USER 5 in the Workbench save dialog (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm USER 6 in the Workbench save dialog (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm USER 7 in the Workbench save dialog (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm USER 8 in the Workbench save dialog (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm USER 9 in the Workbench save dialog (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm USER 10 in the Workbench save dialog (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm USER 11 in the Workbench save dialog (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm USER 12 in the Workbench save dialog (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm USER 13 in the Workbench save dialog (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm USER 14 in the Workbench save dialog (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm USER 15 in the Workbench save dialog (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm USER 16 in the Workbench save dialog (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you open SAVE and save to remembered USER 1 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you open SAVE and save to remembered USER 2 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you open SAVE and save to remembered USER 3 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you open SAVE and save to remembered USER 4 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you open SAVE and save to remembered USER 5 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you open SAVE and save to remembered USER 6 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you open SAVE and save to remembered USER 7 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you open SAVE and save to remembered USER 8 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you open SAVE and save to remembered USER 9 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you open SAVE and save to remembered USER 10 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you open SAVE and save to remembered USER 11 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you open SAVE and save to remembered USER 12 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you open SAVE and save to remembered USER 13 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you open SAVE and save to remembered USER 14 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you open SAVE and save to remembered USER 15 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you open SAVE and save to remembered USER 16 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send the project-save command targeting USER 1 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the project-save command targeting USER 2 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the project-save command targeting USER 3 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the project-save command targeting USER 4 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the project-save command targeting USER 5 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the project-save command targeting USER 6 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the project-save command targeting USER 7 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the project-save command targeting USER 8 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the project-save command targeting USER 9 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the project-save command targeting USER 10 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the project-save command targeting USER 11 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the project-save command targeting USER 12 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the project-save command targeting USER 13 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the project-save command targeting USER 14 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the project-save command targeting USER 15 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the project-save command targeting USER 16 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if Workbench has just installed Open and Open reports no sample bank it can recognize",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if Workbench has just installed Open and Open reports no sample bank it can recognize",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if Workbench has just installed Open and Open reports no sample bank it can recognize",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if Workbench has just installed Open and Open reports no sample bank it can recognize",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if Workbench has just installed Open and Open reports no sample bank it can recognize",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if Workbench has just installed Open and Open reports no sample bank it can recognize",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Open cannot use Pigeon’s audio as its own sample bank. Changing Open preferences or saving a USER project can replace part of that audio without asking to replace Pigeon’s work. A sample upload can reach more of it. Built-in samples are added after installation only when Open finds no recognizable sample bank; the information Open needs to read an older bank can survive Pigeon’s firmware updater. Back up Pigeon’s sample bank before switching.",
     "Workbench adds factory samples only if Open reports no sample bank it can recognize. A bank ready to use stays; an error does not cause automatic repair."
    ],
    "owner_text": "At risk by itself: shared song and drum sample bank. At risk by itself, under a condition: saved pattern A; saved pattern B; saved pattern C; saved pattern D; the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets. At risk when you act: slice positions set by hand in the older format; user sample USR1 in the older format; chops, drum-pad and performance edits; user sample USR2 in the older format; user sample USR3 in the older format; older user preset bank 1; older user preset bank 2; last working session; preferences, MIDI LEARN and panel calibration. Open cannot use Pigeon’s audio as its own sample bank. Changing Open preferences or saving a USER project can replace part of that audio without asking to replace Pigeon’s work. A sample upload can reach more of it. Built-in samples are added after installation only when Open finds no recognizable sample bank; the information Open needs to read an older bank can survive Pigeon’s firmware updater. Back up Pigeon’s sample bank before switching. Workbench adds factory samples only if Open reports no sample bank it can recognize. A bank ready to use stays; an error does not cause automatic repair.",
    "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": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you confirm deletion of the active user slot (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE in the save screen (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you release a short SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FM-106",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "FM-106 Beta4 does not save edited user sounds, even when it says the save worked. Export them before turning off the FM-1 or changing firmware again."
    ],
    "owner_text": "At risk by itself: preferences, MIDI LEARN and panel calibration. At risk when you act: shared song and drum sample bank. FM-106 Beta4 does not save edited user sounds, even when it says the save worked. Export them before turning off the FM-1 or changing firmware again.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "hortator",
    "name": "Hortator",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you remember or forget a Bluetooth device (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Hortator",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sample USR1 in the older format (Hortator uses its own one-shot sound engines, so saved loops and slices play differently)",
     "user sample USR2 in the older format (Hortator uses its own one-shot sound engines, so saved loops and slices play differently)",
     "user sample USR3 in the older format (Hortator uses its own one-shot sound engines, so saved loops and slices play differently)"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: preferences, MIDI LEARN and panel calibration. At risk when you act: shared song and drum sample bank; saved pattern A; saved pattern B; saved pattern C; saved pattern D. Carried over: user sample USR1 in the older format (Hortator uses its own one-shot sound engines, so saved loops and slices play differently); user sample USR2 in the older format (Hortator uses its own one-shot sound engines, so saved loops and slices play differently); user sample USR3 in the older format (Hortator uses its own one-shot sound engines, so saved loops and slices play differently).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "obervave",
    "name": "OberVave",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you install OberVave",
        "effect": "lost"
       },
       {
        "way": "when you request a copy into pattern 1 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you request a copy into pattern 2 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you request a copy into pattern 3 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you request a copy into pattern 4 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you request a copy into pattern 5 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you request a copy into pattern 6 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you request a copy into pattern 7 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you request a copy into pattern 8 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you tap SAVE in the sequencer (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you tap SAVE twice outside the sequencer (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: shared song and drum sample bank; preferences, MIDI LEARN and panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "polly",
    "name": "Polly",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you install Polly",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank from the computer (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a QY70 style bank directly with a computer tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "partly lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "partly lost"
       },
       {
        "way": "when you choose COPY SONG",
        "effect": "partly lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "partly lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "partly lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key",
        "effect": "partly lost"
       },
       {
        "way": "when you install a QY70 style bank from the computer (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "partly lost"
       },
       {
        "way": "when you send a QY70 style bank directly with a computer tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank from the computer (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a QY70 style bank directly with a computer tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank from the computer (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a QY70 style bank directly with a computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete power-on hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank from the computer (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a QY70 style bank directly with a computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank from the computer (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a QY70 style bank directly with a computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "After you agree to restore on the computer, Polly starts erasing before the FM-1 asks. Saying no on the FM-1 keeps Polly’s current project, but cannot bring back erased data from your previous firmware, even if the computer says nothing changed."
    ],
    "owner_text": "At risk by itself: shared song and drum sample bank; saved pattern A; saved pattern B; saved pattern C; saved pattern D; the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; user sample USR1 in the older format; slice positions set by hand in the older format (partly lost); chops, drum-pad and performance edits; user sample USR2 in the older format; preferences, MIDI LEARN and panel calibration. At risk when you act: user sample USR3 in the older format; older user preset bank 1; older user preset bank 2; last working session. After you agree to restore on the computer, Polly starts erasing before the FM-1 asks. Saying no on the FM-1 keeps Polly’s current project, but cannot bring back erased data from your previous firmware, even if the computer says nothing changed.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "skiff",
    "name": "Skiff",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if an older project can be read and its patterns need a new format",
        "effect": "lost"
       },
       {
        "way": "when you confirm a sample upload in the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm clearing a pattern or song entry (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you copy or change an entry’s pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you install Skiff",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you confirm a sample upload in the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its RESTORE LAST is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a readable old autosave needs conversion and its patterns fit",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed automatically: Skiff can use or clear some shared preferences and save without asking. Its settings updates can replace both saved copies. Keeping calibration does not mean all saved settings survive"
       },
       {
        "way": "automatically, only if Skiff has not yet made its one-time settings changes",
        "effect": "changed automatically: Skiff can use or clear some shared preferences and save without asking. Its settings updates can replace both saved copies. Keeping calibration does not mean all saved settings survive"
       },
       {
        "way": "automatically, only if Skiff starts without recovering from a crash, freeze or failed start and has not already cleared the old scene storage",
        "effect": "changed automatically: Skiff can use or clear some shared preferences and save without asking. Its settings updates can replace both saved copies. Keeping calibration does not mean all saved settings survive"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (without asking)",
        "effect": "changed automatically: Skiff can use or clear some shared preferences and save without asking. Its settings updates can replace both saved copies. Keeping calibration does not mean all saved settings survive"
       },
       {
        "way": "when you confirm RESET SETTINGS (asks first: press again to confirm)",
        "effect": "changed automatically: Skiff can use or clear some shared preferences and save without asking. Its settings updates can replace both saved copies. Keeping calibration does not mean all saved settings survive"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you confirm a sample upload in the web editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you confirm erasing a sample slot (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you confirm a sample upload in the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you confirm a sample upload in the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you confirm a sample upload in the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a readable old Felucca/Skiff project needs conversion, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE AS in the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project with the web editor’s older save command (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a readable old Felucca/Skiff project needs conversion, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE AS in the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project with the web editor’s older save command (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a readable old Felucca/Skiff project needs conversion, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE AS in the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project with the web editor’s older save command (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a readable old Felucca/Skiff project needs conversion, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE AS in the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project with the web editor’s older save command (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a valid older FM6 patch bank is still stored and no current set of FM6 patches can be loaded",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store an FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a valid older FM6 patch bank is still stored and no current set of FM6 patches can be loaded",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send an FM6 patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send an FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store an FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save, import, erase or rename a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save, import, erase or rename a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "If PIGEON still uses its older sample slots, Skiff automatically saves edited USR1 slices after you leave SLICES and playback stops. Without asking, that save erases PIGEON’s chop, drum-pad and performance edits.",
     "Skiff keeps the saved RESTORE LAST choice: ON allows autosave; OFF disables it.",
     "Skiff reads older FM6 patches for user presets until you write over the saved data. A separate saved FM6 patch works only while its matching FM6 user sound is still stored.",
     "Skiff reads slice positions set by hand in the older format until you write over the saved data. Saved slice points alone do not keep the sample they use.",
     "Skiff reads user sample USR2 in the older format until you write over the saved data. Skiff uses its own sound engines, so saved loops or slices can play differently.",
     "Skiff reads user sample USR3 in the older format until you write over the saved data. Skiff uses its own sound engines, so saved loops or slices can play differently."
    ],
    "owner_text": "At risk by itself: shared song and drum sample bank; chops, drum-pad and performance edits; last working session; preferences, MIDI LEARN and panel calibration; slice positions set by hand in the older format; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format. At risk by itself, under a condition: saved pattern A; saved pattern B; saved pattern C; saved pattern D; the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets. At risk when you act: older user preset bank 1; older user preset bank 2. If PIGEON still uses its older sample slots, Skiff automatically saves edited USR1 slices after you leave SLICES and playback stops. Without asking, that save erases PIGEON’s chop, drum-pad and performance edits. Skiff keeps the saved RESTORE LAST choice: ON allows autosave; OFF disables it. Skiff reads older FM6 patches for user presets until you write over the saved data. A separate saved FM6 patch works only while its matching FM6 user sound is still stored. Skiff reads slice positions set by hand in the older format until you write over the saved data. Saved slice points alone do not keep the sample they use. Skiff reads user sample USR2 in the older format until you write over the saved data. Skiff uses its own sound engines, so saved loops or slices can play differently. Skiff reads user sample USR3 in the older format until you write over the saved data. Skiff uses its own sound engines, so saved loops or slices can play differently.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "sloopdx",
    "name": "sloopDX",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you leave a bank with unsaved voice changes and a bank is active",
        "effect": "lost"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you erase the selected bank from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you install or update firmware",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save MY KIT by tapping SAVE twice from KIT or LANE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank by tapping EDIT twice on Store (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank from the DX7 list (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send MY KIT from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a DX7 bank from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a DX7 bank with a computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when the working loop has unsaved changes, no song is playing, and you start an update or enter UPDATE MODE",
        "effect": "lost"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when the working loop has unsaved changes, no song is playing, and you start an update or enter UPDATE MODE",
        "effect": "lost"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only when you leave a bank with unsaved voice changes and a bank is active",
        "effect": "lost"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you erase the selected bank from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save MY KIT by tapping SAVE twice from KIT or LANE (asks first: press again to confirm)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save the active bank by tapping EDIT twice on Store (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank from the DX7 list (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send MY KIT from the web editor (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a DX7 bank from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a DX7 bank with a computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when the saved input setting selects one MIDI channel rather than NOTES or CLOCK",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls at power-on (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings, MIDI controls or a theme with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you leave a bank with unsaved voice changes and a bank is active",
        "effect": "lost"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you erase the selected bank from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank by tapping EDIT twice on Store (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank from the DX7 list (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a DX7 bank from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a DX7 bank with a computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "partly lost",
      "ways": [
       {
        "way": "automatically, only when you leave a bank with unsaved voice changes and a bank is active",
        "effect": "partly lost"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "partly lost"
       },
       {
        "way": "when you erase the selected bank from the web editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "partly lost"
       },
       {
        "way": "when you save the active bank by tapping EDIT twice on Store (asks first: press again to confirm)",
        "effect": "partly lost"
       },
       {
        "way": "when you save the active bank from the DX7 list (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you save the active bank from the web editor (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you send a DX7 bank from the web editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you send or erase a DX7 bank with a computer tool (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you leave a bank with unsaved voice changes and a bank is active",
        "effect": "lost"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you erase the selected bank from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank by tapping EDIT twice on Store (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank from the DX7 list (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a DX7 bank from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a DX7 bank with a computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section and confirm it on the SECTION page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a section with SAVE and white keys 5–8 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section and confirm it on the SECTION page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a section with SAVE and white keys 5–8 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section and confirm it on the SECTION page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a section with SAVE and white keys 5–8 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section and confirm it on the SECTION page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a section with SAVE and white keys 5–8 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "sloopDX keeps stored but does not show older user preset bank 1 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
     "sloopDX keeps stored but does not show older user preset bank 2 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound."
    ],
    "owner_text": "At risk by itself: shared song and drum sample bank; the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; user sample USR2 in the older format; preferences, MIDI LEARN and panel calibration. At risk by itself, under a condition: user sample USR1 in the older format; slice positions set by hand in the older format (partly lost); chops, drum-pad and performance edits. At risk when you act: saved pattern A; saved pattern B; saved pattern C; saved pattern D; older user preset bank 1; older user preset bank 2. sloopDX keeps stored but does not show older user preset bank 1 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound. sloopDX keeps stored but does not show older user preset bank 2 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "rainbow",
    "name": "Rainbow Mode",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Saving a WRITE song in Rainbow replaces PIGEON’s MIDI LEARN assignments. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "changed to the new format: Saving a WRITE song in Rainbow replaces PIGEON’s MIDI LEARN assignments. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "changed to the new format: Saving a WRITE song in Rainbow replaces PIGEON’s MIDI LEARN assignments. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "changed to the new format: Saving a WRITE song in Rainbow replaces PIGEON’s MIDI LEARN assignments. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "changed to the new format: Saving a WRITE song in Rainbow replaces PIGEON’s MIDI LEARN assignments. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "changed to the new format: Saving a WRITE song in Rainbow replaces PIGEON’s MIDI LEARN assignments. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       }
      ]
     },
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       }
      ]
     },
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "These shared settings leave RESTORE LAST on by default. A saved OFF choice stops automatic saving.",
     "Rainbow Mode reads older FM6 patches for user presets until you write over the saved data. Changing a sound or its format can make its separate patch unavailable.",
     "Rainbow Mode reads user sample USR1 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads user sample USR2 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads user sample USR3 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads older user preset bank 1 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question.",
     "Rainbow Mode reads older user preset bank 2 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question."
    ],
    "owner_text": "At risk by itself: preferences, MIDI LEARN and panel calibration. At risk by itself, under a condition: the older FM6 patch bank PIGEON no longer uses; last working session; older FM6 patches for user presets. At risk when you act: shared song and drum sample bank; saved pattern A; saved pattern B; saved pattern C; saved pattern D; slice positions set by hand in the older format; chops, drum-pad and performance edits; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format; older user preset bank 1; older user preset bank 2. These shared settings leave RESTORE LAST on by default. A saved OFF choice stops automatic saving. Rainbow Mode reads older FM6 patches for user presets until you write over the saved data. Changing a sound or its format can make its separate patch unavailable. Rainbow Mode reads user sample USR1 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads user sample USR2 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads user sample USR3 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads older user preset bank 1 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Rainbow Mode reads older user preset bank 2 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "duell",
    "name": "DUELL beta",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its RESTORE LAST is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only if loading M01 at first start changes the music and RESTORE LAST is on",
        "effect": "lost"
       },
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change MIDI LEARN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change USB serial settings from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you change preferences from the editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user wavetable directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a pattern (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user wavetable directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a user wavetable from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user wavetable directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a user wavetable directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a user wavetable from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user wavetable directly with a MIDI tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you save or erase a pattern (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost"
       },
       {
        "way": "when you send a user wavetable directly with a MIDI tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a user wavetable from the editor",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save a multi directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save a multi from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a pattern (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "The installer starts with its erase option selected for this firmware change. Clear it before installing to avoid this extra erase."
    ],
    "owner_text": "At risk by itself: last working session; preferences, MIDI LEARN and panel calibration. At risk when you act: shared song and drum sample bank; saved pattern A; saved pattern B; saved pattern C; saved pattern D; the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; user sample USR1 in the older format; slice positions set by hand in the older format; chops, drum-pad and performance edits; user sample USR2 in the older format; user sample USR3 in the older format; older user preset bank 1; older user preset bank 2. The installer starts with its erase option selected for this firmware change. Clear it before installing to avoid this extra erase.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fimba",
    "name": "FiMba-1 beta",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE briefly (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FiMba-1 beta",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "If your PIGEON sample bank reaches the storage that installing FiMba-1 beta writes over, PIGEON can no longer read any of the bank, either song or the kit. Export the PIGEON session and audio bank before switching."
    ],
    "owner_text": "At risk by itself: preferences, MIDI LEARN and panel calibration. At risk when you act: shared song and drum sample bank; older user preset bank 1. If your PIGEON sample bank reaches the storage that installing FiMba-1 beta writes over, PIGEON can no longer read any of the bank, either song or the kit. Export the PIGEON session and audio bank before switching.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "maku",
    "name": "MAKU",
    "flags": "CSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a valid older FM6 bank is still stored and no valid set of FM6 patches for your sounds is stored",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install MAKU",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold REC for about two seconds to clear every like (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you tap REC to like the current world (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "older FM6 patches for user presets",
     "preferences, MIDI LEARN and panel calibration"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself, under a condition: the older FM6 patch bank PIGEON no longer uses. At risk when you act: shared song and drum sample bank; last working session. Carried over: older FM6 patches for user presets; preferences, MIDI LEARN and panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fart",
    "name": "Fart Machine One",
    "flags": "S",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Fart Machine One",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Fart Machine One does not import or save a music setup or loop. SAVE does nothing. Its recorded loop, tempo and effect choices last only while it stays on. Calibration is separate.",
     "If your PIGEON sample bank reaches the storage that installing Fart Machine One writes over, PIGEON can no longer read any of the bank, either song or the kit. Export the PIGEON session and audio bank before switching."
    ],
    "owner_text": "At risk when you act: shared song and drum sample bank; older user preset bank 1. Fart Machine One does not import or save a music setup or loop. SAVE does nothing. Its recorded loop, tempo and effect choices last only while it stays on. Calibration is separate. If your PIGEON sample bank reaches the storage that installing Fart Machine One writes over, PIGEON can no longer read any of the bank, either song or the kit. Export the PIGEON session and audio bank before switching.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "chord",
    "name": "fm1-chord",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "changed to the new format: Once fm1-chord saves its settings, PIGEON cannot read the newer saved copy when you return. Shared preferences and panel calibration may use defaults"
       },
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Once fm1-chord saves its settings, PIGEON cannot read the newer saved copy when you return. Shared preferences and panel calibration may use defaults"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "changed to the new format: Once fm1-chord saves its settings, PIGEON cannot read the newer saved copy when you return. Shared preferences and panel calibration may use defaults"
       },
       {
        "way": "when you change favourites or their filter (without asking)",
        "effect": "changed to the new format: Once fm1-chord saves its settings, PIGEON cannot read the newer saved copy when you return. Shared preferences and panel calibration may use defaults"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "changed to the new format: Once fm1-chord saves its settings, PIGEON cannot read the newer saved copy when you return. Shared preferences and panel calibration may use defaults"
       },
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a chord preset (without asking)",
        "effect": "changed to the new format: Once fm1-chord saves its settings, PIGEON cannot read the newer saved copy when you return. Shared preferences and panel calibration may use defaults"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "changed to the new format: Once fm1-chord saves its settings, PIGEON cannot read the newer saved copy when you return. Shared preferences and panel calibration may use defaults"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice positions set by hand (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you install fm1-chord",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or clear a user sample (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a chord preset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a chord preset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a chord preset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a chord preset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase an FM6 bank patch from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 bank patch from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send or erase an FM6 bank patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase an FM6 bank patch from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 bank patch from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase an FM6 bank patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice positions set by hand (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample directly with a MIDI tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload or clear a user sample (the computer asks first)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice positions set by hand (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or clear a user sample (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a user sound (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you send, store or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a user sound (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you send, store or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or clear a user sample (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or clear a user sample (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or clear a user sample (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "fm1-chord reads the older FM6 patch bank PIGEON no longer uses until you write over the saved data.",
     "fm1-chord reads user sample USR1 in the older format until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored.",
     "fm1-chord reads user sample USR2 in the older format until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored.",
     "fm1-chord reads user sample USR3 in the older format until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored."
    ],
    "owner_text": "At risk by itself: preferences, MIDI LEARN and panel calibration. At risk when you act: shared song and drum sample bank; saved pattern A; saved pattern B; saved pattern C; saved pattern D; the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; slice positions set by hand in the older format; chops, drum-pad and performance edits; older user preset bank 1; older user preset bank 2; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format. fm1-chord reads the older FM6 patch bank PIGEON no longer uses until you write over the saved data. fm1-chord reads user sample USR1 in the older format until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored. fm1-chord reads user sample USR2 in the older format until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored. fm1-chord reads user sample USR3 in the older format until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "sloopbanks",
    "name": "SLOOP DX7 Banks",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use (when the web editor connects or refreshes, this bank has no usable voices and factory auto-fill is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when DX7 Banks’ saved count of banks already set up is below 2",
        "effect": "lost"
       },
       {
        "way": "automatically, only when DX7 Banks’ saved count of banks already set up is below 3",
        "effect": "lost"
       },
       {
        "way": "automatically, only when DX7 Banks’ saved count of banks already set up is below 4",
        "effect": "lost"
       },
       {
        "way": "when you erase a DX7 bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample slot from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you install SLOOP DX7 Banks",
        "effect": "lost"
       },
       {
        "way": "when you move a voice between DX7 banks from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you put the factory voices back from the editor",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a DX7 bank from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample kit to USR3 and USR4 (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample set from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you use the editor to load several DX7 files into banks that look empty (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically, only when the working loop has unsaved changes, no song is playing, and you start an update, enter UPDATE MODE or restart with the computer tool",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you have restored a working loop from a backup",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically, only when the working loop has unsaved changes, no song is playing, and you start an update, enter UPDATE MODE or restart with the computer tool",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you have restored a working loop from a backup",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save SYN drum kits from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a song order from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a section on the SAVE PROJECT page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section with SAVE and a section key (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a section on the SAVE PROJECT page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section with SAVE and a section key (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a section on the SAVE PROJECT page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section with SAVE and a section key (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a section on the SAVE PROJECT page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section with SAVE and a section key (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample kit to USR3 and USR4 (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you send a sample set from the web editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample set from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save selected DX7 voices from the editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 bank patch from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample set from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample set from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample kit to USR3 and USR4 (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample set from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a USER sound on the FM-1 (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save selected DX7 voices from the editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a USER sound on the FM-1 (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save selected DX7 voices from the editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "SLOOP DX7 Banks reads user sample USR1 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP DX7 Banks reads user sample USR2 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP DX7 Banks reads user sample USR3 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP DX7 Banks keeps stored but does not show older user preset bank 1 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
     "SLOOP DX7 Banks keeps stored but does not show older user preset bank 2 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound."
    ],
    "owner_text": "At risk by itself: shared song and drum sample bank; the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; preferences, MIDI LEARN and panel calibration. At risk when you act: saved pattern A; saved pattern B; saved pattern C; saved pattern D; slice positions set by hand in the older format; chops, drum-pad and performance edits; last working session; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format; older user preset bank 1; older user preset bank 2. SLOOP DX7 Banks reads user sample USR1 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP DX7 Banks reads user sample USR2 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP DX7 Banks reads user sample USR3 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP DX7 Banks keeps stored but does not show older user preset bank 1 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound. SLOOP DX7 Banks keeps stored but does not show older user preset bank 2 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fumi",
    "name": "FuMi-1",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "If your PIGEON sample bank reaches the storage that installing FuMi-1 writes over, PIGEON can no longer read any of the bank, either song or the kit. Export the PIGEON session and audio bank before switching."
    ],
    "owner_text": "At risk by itself: preferences, MIDI LEARN and panel calibration. At risk when you act: shared song and drum sample bank; older user preset bank 1. If your PIGEON sample bank reaches the storage that installing FuMi-1 writes over, PIGEON can no longer read any of the bank, either song or the kit. Export the PIGEON session and audio bank before switching.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "jangada",
    "name": "Jangada",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically during use (if the second core fails and playback stops, with AUTO selected by default)",
        "effect": "lost"
       },
       {
        "way": "when you enter power-on hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you learn or clear MIDI CC mappings (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you set screen colours from the USB console (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase user samples or restore an empty sample slot in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you install Jangada",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to the FM-1 from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm SAVE for project 1 (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm SAVE for project 2 (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm SAVE for project 3 (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm SAVE for project 4 (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you erase user samples or restore an empty sample slot in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you send user samples to the FM-1 from the web editor (the computer asks first)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase user samples or restore an empty sample slot in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to the FM-1 from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. PIGEON cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user preset (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. PIGEON cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. PIGEON cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you send user sounds to Jangada with a computer tool, without the web editor (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. PIGEON cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you store a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. PIGEON cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. PIGEON cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user preset (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. PIGEON cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. PIGEON cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you send user sounds to Jangada with a computer tool, without the web editor (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. PIGEON cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you store a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. PIGEON cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       }
      ]
     },
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a DX7 bank being sent to the FM-1 (asks first which bank to replace)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a DX7 bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase FM6 sounds in Jangada with a computer tool, without the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store an FM6 sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase user samples or restore an empty sample slot in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to the FM-1 from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase user samples or restore an empty sample slot in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to the FM-1 from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase user samples or restore an empty sample slot in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to the FM-1 from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Jangada can use older sample slots still stored on the FM-1. It cannot read Pigeon’s current combined sample bank. Only version 1 sounds from older sound banks can be imported; current versions look empty.",
     "Jangada reads user sample USR1 in the older format until you write over the saved data. This applies only to older sample slots still stored on the FM-1. Pigeon’s current combined sample bank cannot be imported.",
     "Jangada reads user sample USR2 in the older format until you write over the saved data. This applies only to older sample slots still stored on the FM-1. Pigeon’s current combined sample bank cannot be imported.",
     "Jangada reads user sample USR3 in the older format until you write over the saved data. This applies only to older sample slots still stored on the FM-1. Pigeon’s current combined sample bank cannot be imported."
    ],
    "owner_text": "At risk by itself: the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; preferences, MIDI LEARN and panel calibration. At risk when you act: shared song and drum sample bank; saved pattern A; saved pattern B; saved pattern C; saved pattern D; slice positions set by hand in the older format; chops, drum-pad and performance edits; older user preset bank 1; older user preset bank 2; last working session; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format. Jangada can use older sample slots still stored on the FM-1. It cannot read Pigeon’s current combined sample bank. Only version 1 sounds from older sound banks can be imported; current versions look empty. Jangada reads user sample USR1 in the older format until you write over the saved data. This applies only to older sample slots still stored on the FM-1. Pigeon’s current combined sample bank cannot be imported. Jangada reads user sample USR2 in the older format until you write over the saved data. This applies only to older sample slots still stored on the FM-1. Pigeon’s current combined sample bank cannot be imported. Jangada reads user sample USR3 in the older format until you write over the saved data. This applies only to older sample slots still stored on the FM-1. Pigeon’s current combined sample bank cannot be imported.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "waveloop",
    "name": "WaveLoop FM-1",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use, from its second start, after five seconds with playback stopped, no sound and no music changes",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at its first start, after five seconds with playback stopped, no sound and no music changes",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "kept: WaveLoop FM-1 can read it"
       },
       {
        "way": "when you calibrate the buttons and knob at power-on; cancelling also requests a settings save (without asking)",
        "effect": "kept: WaveLoop FM-1 can read it"
       },
       {
        "way": "when you change a favourite mark or the filter for favourites (without asking)",
        "effect": "kept: WaveLoop FM-1 can read it"
       },
       {
        "way": "when you erase a starred user sound, which also removes its favourite mark (asks first)",
        "effect": "kept: WaveLoop FM-1 can read it"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run MENU calibration, then close MENU (without asking)",
        "effect": "kept: WaveLoop FM-1 can read it"
       },
       {
        "way": "when you send MENU settings, display preferences or favourite changes from the editor (without asking)",
        "effect": "kept: WaveLoop FM-1 can read it"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if the song order or selection has unsaved changes and project slot D is empty, holds WaveLoop’s automatically saved session or holds data WaveLoop cannot read",
        "effect": "lost"
       },
       {
        "way": "automatically, only if this song is chosen for automatic saving after loading, saving or restoring a session, and project slot D is empty, holds a session saved automatically for the next start or holds data WaveLoop cannot read; playback must be stopped, with five seconds of silence and no music changes",
        "effect": "lost"
       },
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you install WaveLoop FM-1",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if this song is chosen for automatic saving after loading, saving or restoring a session, and project slot D is empty, holds a session saved automatically for the next start or holds data WaveLoop cannot read; playback must be stopped, with five seconds of silence and no music changes",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if this song is chosen for automatic saving after loading, saving or restoring a session, and project slot D is empty, holds a session saved automatically for the next start or holds data WaveLoop cannot read; playback must be stopped, with five seconds of silence and no music changes",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 or DRUM user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you store the current FM6 or DRUM sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if the song order or selection has unsaved changes and project slot D is empty, holds WaveLoop’s automatically saved session or holds data WaveLoop cannot read",
        "effect": "partly lost"
       },
       {
        "way": "automatically, only if this song is chosen for automatic saving after loading, saving or restoring a session, and project slot D is empty, holds a session saved automatically for the next start or holds data WaveLoop cannot read; playback must be stopped, with five seconds of silence and no music changes",
        "effect": "partly lost"
       },
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped",
        "effect": "partly lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if the song order or selection has unsaved changes and project slot D is empty, holds WaveLoop’s automatically saved session or holds data WaveLoop cannot read",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only if this song is chosen for automatic saving after loading, saving or restoring a session, and project slot D is empty, holds a session saved automatically for the next start or holds data WaveLoop cannot read; playback must be stopped, with five seconds of silence and no music changes",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 or DRUM user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current FM6 or DRUM sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a user sound (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a user sound (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "WaveLoop FM-1 reads older FM6 patches for user presets until you write over the saved data. Changing a sound or its format can make its separate patch unavailable.",
     "WaveLoop FM-1 reads user sample USR1 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Saved samples may have no slice positions set by you.",
     "WaveLoop FM-1 reads user sample USR2 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Saved samples may have no slice positions set by you.",
     "WaveLoop FM-1 reads older user preset bank 1 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question.",
     "WaveLoop FM-1 reads older user preset bank 2 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question.",
     "WaveLoop FM-1 reads preferences, MIDI LEARN and panel calibration until you write over the saved data. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices."
    ],
    "owner_text": "At risk by itself: saved pattern A; saved pattern D; preferences, MIDI LEARN and panel calibration. At risk by itself, under a condition: shared song and drum sample bank; saved pattern B; saved pattern C; the older FM6 patch bank PIGEON no longer uses; slice positions set by hand in the older format; user sample USR3 in the older format; older FM6 patches for user presets. At risk when you act: chops, drum-pad and performance edits; user sample USR1 in the older format; user sample USR2 in the older format; older user preset bank 1; older user preset bank 2. WaveLoop FM-1 reads older FM6 patches for user presets until you write over the saved data. Changing a sound or its format can make its separate patch unavailable. WaveLoop FM-1 reads user sample USR1 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Saved samples may have no slice positions set by you. WaveLoop FM-1 reads user sample USR2 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Saved samples may have no slice positions set by you. WaveLoop FM-1 reads older user preset bank 1 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. WaveLoop FM-1 reads older user preset bank 2 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. WaveLoop FM-1 reads preferences, MIDI LEARN and panel calibration until you write over the saved data. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "orbit",
    "name": "ORBIT",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if it can resume music saved in a SLOOP format from before version 2.6 with a usable drum MIDI channel, and your saved settings include SYN drum kits but no MIDI controls or channels",
        "effect": "lost"
       },
       {
        "way": "automatically, only when song order has an unsaved change as an update or restart starts",
        "effect": "lost"
       },
       {
        "way": "when you hold both OCT buttons as you turn it on to calibrate the controls (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE on the SONG screen (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or MIDI control assignments with a computer tool or store SYN kits from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored during playback or before a restart is still waiting to be saved",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE > PROJECT > SAVE and repeat the action before the time runs out (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE and press white key 5–8 to save section A–D (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save, restore or clear a section with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored during playback or before a restart is still waiting to be saved",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE > PROJECT > SAVE and repeat the action before the time runs out (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE and press white key 5–8 to save section A–D (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save, restore or clear a section with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored during playback or before a restart is still waiting to be saved",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE > PROJECT > SAVE and repeat the action before the time runs out (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE and press white key 5–8 to save section A–D (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save, restore or clear a section with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored during playback or before a restart is still waiting to be saved",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE > PROJECT > SAVE and repeat the action before the time runs out (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE and press white key 5–8 to save section A–D (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save, restore or clear a section with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you install ORBIT",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or restore a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample, CHOP selection or drum kit from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you erase a sample with a MIDI tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or restore a sample with a MIDI tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload a sample, CHOP selection or drum kit from the web editor (the computer asks first)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or restore a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample, CHOP selection or drum kit from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose SAVE > USER > SAVE or ERASE and repeat the action (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you erase a used USER sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you send, erase, rename or restore user sounds with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store DX7 cartridge voices with optional USER sound links from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you store a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose SAVE > USER > SAVE or ERASE and repeat the action (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you erase a used USER sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you send, erase, rename or restore user sounds with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store DX7 cartridge voices with optional USER sound links from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you store a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       }
      ]
     },
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send, erase or restore FM6 patches with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store an FM6 patch from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store selected DX7 cartridge voices from the web editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or restore a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample, CHOP selection or drum kit from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or restore a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample, CHOP selection or drum kit from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or restore a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample, CHOP selection or drum kit from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "If your PIGEON sample bank is large enough to reach the flash that installing ORBIT writes, PIGEON then rejects the whole bank, both songs and the kit. Export the PIGEON session and audio bank before switching.",
     "ORBIT reads user sample USR1 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "ORBIT reads user sample USR2 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "ORBIT reads user sample USR3 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules."
    ],
    "owner_text": "At risk by itself: the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; preferences, MIDI LEARN and panel calibration. At risk by itself, under a condition: saved pattern A; saved pattern B; saved pattern C; saved pattern D. At risk when you act: shared song and drum sample bank; slice positions set by hand in the older format; chops, drum-pad and performance edits; older user preset bank 1; older user preset bank 2; last working session; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format. If your PIGEON sample bank is large enough to reach the flash that installing ORBIT writes, PIGEON then rejects the whole bank, both songs and the kit. Export the PIGEON session and audio bank before switching. ORBIT reads user sample USR1 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. ORBIT reads user sample USR2 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. ORBIT reads user sample USR3 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "floyd",
    "name": "SLOOP Floyd FM",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you install SLOOP Floyd FM",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "partly lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [
     "older user preset bank 1 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound)",
     "older user preset bank 2 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound)"
    ],
    "notes": [
     "SLOOP Floyd FM reads user sample USR1 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads user sample USR2 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads user sample USR3 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops."
    ],
    "owner_text": "At risk by itself: the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; preferences, MIDI LEARN and panel calibration. At risk when you act: shared song and drum sample bank; saved pattern A; saved pattern B; saved pattern C; saved pattern D; slice positions set by hand in the older format (partly lost); chops, drum-pad and performance edits; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format. Kept but not shown: older user preset bank 1 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound); older user preset bank 2 (Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound). SLOOP Floyd FM reads user sample USR1 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads user sample USR2 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads user sample USR3 in the older format until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "winampfm",
    "name": "winampFM Synth",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if it can resume music saved in a SLOOP format from before version 2.6 with a different usable drum MIDI channel, and your saved settings include SYN drum kits but no MIDI controls or channels",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "lost"
       },
       {
        "way": "when you record the current music into the selected song section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore preferences or store SYN drum kits directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored is still waiting to be saved after a restart",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "lost"
       },
       {
        "way": "when you record the current music into the selected song section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore section A directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the selected project slot with the PROJECT GO knob (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you store section A (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored is still waiting to be saved after a restart",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "lost"
       },
       {
        "way": "when you record the current music into the selected song section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore section B directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the selected project slot with the PROJECT GO knob (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you store section B (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored is still waiting to be saved after a restart",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "lost"
       },
       {
        "way": "when you record the current music into the selected song section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore section C directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the selected project slot with the PROJECT GO knob (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you store section C (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored is still waiting to be saved after a restart",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "lost"
       },
       {
        "way": "when you record the current music into the selected song section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore section D directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the selected project slot with the PROJECT GO knob (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you store section D (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold REC in IMPORTER to erase USR1 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you hold REC in IMPORTER to erase USR2 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you hold REC in IMPORTER to erase USR3 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you hold REC in IMPORTER to erase USR4 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you install winampFM Synth",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase USR1 with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase USR2 with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase USR3 with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase USR4 with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "partly lost",
      "ways": [
       {
        "way": "when you hold REC in IMPORTER to erase USR1 (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you hold REC in IMPORTER to erase USR2 (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you hold REC in IMPORTER to erase USR3 (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload or erase USR1 with a MIDI tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload or erase USR2 with a MIDI tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload or erase USR3 with a MIDI tool (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold REC in IMPORTER to erase USR1 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase USR1 with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "when you store, erase or restore FM6 patches directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold REC in IMPORTER to erase USR1 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase USR1 with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold REC in IMPORTER to erase USR2 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase USR2 with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold REC in IMPORTER to erase USR3 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase USR3 with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a user-sound bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound with a USER GO knob (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send, store or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a user-sound bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound with a USER GO knob (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send, store or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "If your PIGEON sample bank is large enough to reach the flash that installing winampFM Synth writes, PIGEON then rejects the whole bank, both songs and the kit. Export the PIGEON session and audio bank before switching.",
     "winampFM Synth reads user sample USR1 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "winampFM Synth reads user sample USR2 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "winampFM Synth reads user sample USR3 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "winampFM Synth keeps stored but does not show older user preset bank 1 until you write over the saved data. Newer sounds are kept but not shown. Only older version-1 sounds still in the bank can play.",
     "winampFM Synth keeps stored but does not show older user preset bank 2 until you write over the saved data. Newer sounds are kept but not shown. Only older version-1 sounds still in the bank can play."
    ],
    "owner_text": "At risk by itself: the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; preferences, MIDI LEARN and panel calibration. At risk by itself, under a condition: saved pattern A; saved pattern B; saved pattern C; saved pattern D. At risk when you act: shared song and drum sample bank; slice positions set by hand in the older format (partly lost); chops, drum-pad and performance edits; last working session; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format; older user preset bank 1; older user preset bank 2. If your PIGEON sample bank is large enough to reach the flash that installing winampFM Synth writes, PIGEON then rejects the whole bank, both songs and the kit. Export the PIGEON session and audio bank before switching. winampFM Synth reads user sample USR1 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. winampFM Synth reads user sample USR2 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. winampFM Synth reads user sample USR3 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. winampFM Synth keeps stored but does not show older user preset bank 1 until you write over the saved data. Newer sounds are kept but not shown. Only older version-1 sounds still in the bank can play. winampFM Synth keeps stored but does not show older user preset bank 2 until you write over the saved data. Newer sounds are kept but not shown. Only older version-1 sounds still in the bank can play.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "bubba",
    "name": "Bubba Machine (beta)",
    "flags": "ACS?",
    "weakest_grade": "reported",
    "at_risk": [
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when a new recording finishes and playback is stopped",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you load or remove a screen language pack (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a program using the chip-mode rescue tool (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a program using the rescue tool with its question disabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sound or DX7 bank from the control page or with the computer tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a take from the control page or with the computer tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "at an unknown time (the chip maker's code that does this is not public)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "partly lost"
       },
       {
        "way": "automatically, only when a new recording finishes and playback is stopped",
        "effect": "partly lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "partly lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you load or remove a screen language pack (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you send a sound or DX7 bank from the control page or with the computer tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload a take from the control page or with the computer tool (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when a new recording finishes and playback is stopped",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sound or DX7 bank from the control page or with the computer tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you upload a take from the control page or with the computer tool (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "when you load or remove a screen language pack (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a new recording finishes and playback is stopped",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "when you load or remove a screen language pack (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a sound or DX7 bank from the control page or with the computer tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a take from the control page or with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "at an unknown time (the chip maker's code that does this is not public)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "If your PIGEON sample bank is large enough to reach the flash that installing Bubba Machine (beta) writes, PIGEON then rejects the whole bank, both songs and the kit. Export the PIGEON session and audio bank before switching."
    ],
    "owner_text": "At risk by itself: shared song and drum sample bank; saved pattern A; saved pattern B; saved pattern C; saved pattern D; the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; slice positions set by hand in the older format; user sample USR1 in the older format; chops, drum-pad and performance edits; user sample USR2 in the older format; older user preset bank 1; older user preset bank 2. At risk by itself, under a condition: user sample USR3 in the older format. At risk when you act: last working session. If your PIGEON sample bank is large enough to reach the flash that installing Bubba Machine (beta) writes, PIGEON then rejects the whole bank, both songs and the kit. Export the PIGEON session and audio bank before switching.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "salt",
    "name": "Felucca [Salt]",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "changed to the new format: After a settings save here, the previous firmware cannot read the newer saved copy. Its settings and calibration may use defaults when you return. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: After a settings save here, the previous firmware cannot read the newer saved copy. Its settings and calibration may use defaults when you return. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you erase a user sound (asks first or waits for you to turn again)",
        "effect": "changed to the new format: After a settings save here, the previous firmware cannot read the newer saved copy. Its settings and calibration may use defaults when you return. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "changed to the new format: After a settings save here, the previous firmware cannot read the newer saved copy. Its settings and calibration may use defaults when you return. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you send display or favourite changes from the editor (without asking)",
        "effect": "changed to the new format: After a settings save here, the previous firmware cannot read the newer saved copy. Its settings and calibration may use defaults when you return. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you install Felucca [Salt]",
        "effect": "lost"
       },
       {
        "way": "when you send samples to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "partly lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you send samples to the FM-1 from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send samples to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send samples to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send samples to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send samples to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [
     "older user preset bank 1 (These sounds stay stored but cannot be shown or played. Saving replaces only the slot you save into. Back them up before using a slot that looks empty)",
     "older user preset bank 2 (These sounds stay stored but cannot be shown or played. Saving replaces only the slot you save into. Back them up before using a slot that looks empty)"
    ],
    "notes": [
     "Felucca [Salt] reads user sample USR1 in the older format until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions.",
     "Felucca [Salt] reads user sample USR2 in the older format until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions.",
     "Felucca [Salt] reads user sample USR3 in the older format until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions."
    ],
    "owner_text": "At risk by itself: preferences, MIDI LEARN and panel calibration (changed to the new format: After a settings save here, the previous firmware cannot read the newer saved copy. Its settings and calibration may use defaults when you return. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices). At risk when you act: shared song and drum sample bank; saved pattern A; saved pattern B; saved pattern C; saved pattern D; slice positions set by hand in the older format (partly lost); chops, drum-pad and performance edits; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format. Kept but not shown: older user preset bank 1 (These sounds stay stored but cannot be shown or played. Saving replaces only the slot you save into. Back them up before using a slot that looks empty); older user preset bank 2 (These sounds stay stored but cannot be shown or played. Saving replaces only the slot you save into. Back them up before using a slot that looks empty). Felucca [Salt] reads user sample USR1 in the older format until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions. Felucca [Salt] reads user sample USR2 in the older format until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions. Felucca [Salt] reads user sample USR3 in the older format until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fm1move",
    "name": "FM1 Move",
    "flags": "CSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only at first start or on later autosaves after working music changes, unless a sample remains in the old fourth slot",
        "effect": "lost"
       },
       {
        "way": "automatically, only when the device page's Projects tab shows a Working project size greater than 3,824 B and no sample remains in the old fourth slot",
        "effect": "lost"
       },
       {
        "way": "automatically, only when the device page's Projects tab shows a Working project size greater than 7,648 B and no sample remains in the old fourth slot",
        "effect": "lost"
       },
       {
        "way": "when you clear a project with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the device page (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you import a project from the device page (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you install FM1 Move",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE on PROJECT or choose Save here in the device page, after removing any old fourth sample (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the device page (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample directly with a MIDI tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you erase a sample from the device page (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample directly with a MIDI tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload a sample from the device page (the computer asks first)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the device page (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the device page (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear an FM6 bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store or erase an FM6 sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store selected DX7 voices from the device page (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you finish calibration or let it time out after holding both OCT buttons as you turn it on (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or MIDI control assignments with a computer tool or store SYN kits from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the device page (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the device page (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the device page (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the device page (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the device page (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the device page (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you import a preset file from the device page (without asking; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a user-sound bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send, store, rename or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store a user sound from the device page (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you import a preset file from the device page (without asking; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a user-sound bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send, store, rename or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store a user sound from the device page (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "If your PIGEON sample bank is large enough to reach the flash that installing FM1 Move writes, PIGEON then rejects the whole bank, both songs and the kit. Export the PIGEON session and audio bank before switching.",
     "FM1 Move reads user sample USR1 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "FM1 Move reads user sample USR2 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "FM1 Move reads user sample USR3 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "FM1 Move keeps stored but does not show older user preset bank 1 until you write over the saved data. Newer sounds are kept but not shown. Only older version-1 sounds still in the bank can play.",
     "FM1 Move keeps stored but does not show older user preset bank 2 until you write over the saved data. Newer sounds are kept but not shown. Only older version-1 sounds still in the bank can play."
    ],
    "owner_text": "At risk by itself, under a condition: shared song and drum sample bank. At risk when you act: slice positions set by hand in the older format; chops, drum-pad and performance edits; last working session; preferences, MIDI LEARN and panel calibration; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format; older user preset bank 1; older user preset bank 2. If your PIGEON sample bank is large enough to reach the flash that installing FM1 Move writes, PIGEON then rejects the whole bank, both songs and the kit. Export the PIGEON session and audio bank before switching. FM1 Move reads user sample USR1 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. FM1 Move reads user sample USR2 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. FM1 Move reads user sample USR3 in the older format until you write over the saved data. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. FM1 Move keeps stored but does not show older user preset bank 1 until you write over the saved data. Newer sounds are kept but not shown. Only older version-1 sounds still in the bank can play. FM1 Move keeps stored but does not show older user preset bank 2 until you write over the saved data. Newer sounds are kept but not shown. Only older version-1 sounds still in the bank can play.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fm1quest",
    "name": "FM1 Quest",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode or receive a firmware update",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode or receive a firmware update",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode with settings waiting to be saved",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE on the SONG screen (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save section A from SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save section B from SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save section C from SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save section D from SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample with computer commands (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR1 by holding REC on it in IMPORTER (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you install FM1 Quest",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample with computer commands (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase training song H1 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase training song H2 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase training song H3 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase training song H4 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase training song H5 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase training song H6 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase training song P1 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase training song P2 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase training song P3 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase training song P4 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase training song P5 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase training song P6 (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save project A (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save section A from SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as section A (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save project B (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save section B from SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as section B (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save project C (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save section C from SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as section C (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save project D (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save section D from SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as section D (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you erase a sample with computer commands (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you erase sample USR1 by holding REC on it in IMPORTER (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you erase sample USR2 by holding REC on it in IMPORTER (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you erase sample USR3 by holding REC on it in IMPORTER (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you send a sample with computer commands (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you send or erase training song H6 (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample with computer commands (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR1 by holding REC on it in IMPORTER (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR2 by holding REC on it in IMPORTER (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample with computer commands (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR2 by holding REC on it in IMPORTER (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample with computer commands (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR2 by holding REC on it in IMPORTER (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR3 by holding REC on it in IMPORTER (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample with computer commands (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR3 by holding REC on it in IMPORTER (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample with computer commands (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase training song H1 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song H2 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song H3 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song H4 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song H5 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song H6 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P1 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P2 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P3 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P4 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P5 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P6 (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a user-sound bank with computer commands (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a USER sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send, save or erase a user sound with computer commands (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a user-sound bank with computer commands (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a USER sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send, save or erase a user sound with computer commands (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Quest can play your saved USR1 until you write over it, if its audio and zones fit Quest’s smaller sample slot. Sending a sample to USR1 or erasing it loses the old sample. This includes holding REC on USR1 in IMPORTER when Quest can read it. Sending a sample to USR2 or erasing USR2 can damage the end of the old USR1. Back up USR1 first.",
     "FM1 Quest keeps stored but does not show older user preset bank 1 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
     "FM1 Quest keeps stored but does not show older user preset bank 2 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound."
    ],
    "owner_text": "At risk by itself: the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; preferences, MIDI LEARN and panel calibration. At risk when you act: shared song and drum sample bank; saved pattern A; saved pattern B; saved pattern C; saved pattern D; slice positions set by hand in the older format; user sample USR1 in the older format; chops, drum-pad and performance edits; user sample USR2 in the older format; user sample USR3 in the older format; older user preset bank 1; older user preset bank 2. Quest can play your saved USR1 until you write over it, if its audio and zones fit Quest’s smaller sample slot. Sending a sample to USR1 or erasing it loses the old sample. This includes holding REC on USR1 in IMPORTER when Quest can read it. Sending a sample to USR2 or erasing USR2 can damage the end of the old USR1. Back up USR1 first. FM1 Quest keeps stored but does not show older user preset bank 1 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound. FM1 Quest keeps stored but does not show older user preset bank 2 until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "grooveos",
    "name": "Groove OS",
    "flags": "S?",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm installing V15 first, then Groove OS (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [
     "preferences, MIDI LEARN and panel calibration",
     "saved pattern A",
     "saved pattern B",
     "saved pattern C",
     "saved pattern D",
     "last working session",
     "older user preset bank 1",
     "older user preset bank 2",
     "the older FM6 patch bank PIGEON no longer uses",
     "older FM6 patches for user presets",
     "user sample USR1 in the older format",
     "user sample USR2 in the older format",
     "user sample USR3 in the older format",
     "chops, drum-pad and performance edits",
     "slice positions set by hand in the older format"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "The official route first puts V15 back, then installs Groove OS. Treat this firmware’s saved work as lost and back it up with its own tools before starting. Groove OS’s project saves, autosave, preferences, sample uploads and extra installed pages can also replace leftover work; nobody has published which parts of storage they use. A sound missing from PRESETS may still occupy storage, and do not count on Groove OS’s own backups to keep it."
    ],
    "owner_text": "At risk when you act: shared song and drum sample bank. Possibly at risk (layout reported or inferred): preferences, MIDI LEARN and panel calibration; saved pattern A; saved pattern B; saved pattern C; saved pattern D; last working session; older user preset bank 1; older user preset bank 2; the older FM6 patch bank PIGEON no longer uses; older FM6 patches for user presets; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format; chops, drum-pad and performance edits; slice positions set by hand in the older format. The official route first puts V15 back, then installs Groove OS. Treat this firmware’s saved work as lost and back it up with its own tools before starting. Groove OS’s project saves, autosave, preferences, sample uploads and extra installed pages can also replace leftover work; nobody has published which parts of storage they use. A sound missing from PRESETS may still occupy storage, and do not count on Groove OS’s own backups to keep it.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ],
  "uncertainty": "The overlaps are inferred from the supplied source-defined layouts, not tested on a unit; stock and Baud Girl locations are reported or inferred, so their exact losses remain uncertain.",
  "restore_prerequisite": "Restore session and the sample tool’s firmware-install action first capture a recovery session, so they stop before writing if the connected unit has no readable PIGEON shared bank; the separate firmware installer instead asks you to acknowledge that you have backed up and does not capture one for you.",
  "installation_path": "For another custom firmware, the guide’s route is: download its backups, follow its stock-return process to reach M-VAVE V15, then install PIGEON; returning to stock has its own data risks, so do that only after the backup.",
  "autosave_overwrites": "Later music changes can save automatically after ten quiet seconds, at least sixty seconds after a successful prior save, while RESTORE LAST remains on; no question is asked and later writes can replace both copies. See the switching advice in this section for the affected saved work.",
  "calibration_overwrites": "Calibration can write the complete preferences after the power-on procedure returns, even after cancellation, or when Settings closes after menu calibration; it asks no extra question. Unchanged preferences skip the write; changed preferences wait until playback stops, and undo cannot recover overwritten work. See the switching advice in this section for the affected saved work.",
  "sample_overwrites": "The compatible older sample-transfer commands work only while no shared PIGEON bank is active. Starting a slot send invalidates that slot immediately; later blocks replace the space they reach, and a slot erase clears the complete slot, without a device question or undo. See the switching advice in this section for the affected saved work.",
  "chop_overwrites": "Chop, drum-pad and performance edits can save their shared settings after one stopped, silent second without another edit, with no question, when the loaded bank or compatible sample leaves a writable area. See the switching advice in this section for the affected saved work. Compatible older sample audio is not erased by this save, and loaded slice markers are retained; unrelated leftover data there is not preserved.",
  "archive_overwrites": "Restore session to FM1 first asks and captures a recovery session, then writes audio, chop settings, project areas and preferences as described above, including empty archive slots. See the switching advice in this section for the affected saved work. PIGEON’s SAVE, paste and duplicate into A–D, project saves from an editor or MIDI tool, Send bank to FM1 or a bank upload with the bank tool or the library tool’s upload, the older sample-transfer commands, chop saves and other sample-setting writes, bank erases, and backup or session restores (including the library tool’s restore) can also replace ChoralRoot’s legacy sounds 1–32, VA patches, FM6 patches 1–32, CZ patches 1–32 and FM TONE patches, kept for returning to ChoralRoot 0.21 or older.",
  "switching_table_status": "See the switching advice in this section. Back up in the firmware that made the work before installing or starting PIGEON, and download PIGEON bank and session backups before leaving it.",
  "return_trip": "On returning after preference writes, FM-106 or OberVave can reject the replacement and use defaults; OberVave can lose its complete set of 32 programs. See the switching advice in this section for the affected saved work. DUELL and sloopDX can choose a newer stored record and then reject its preference format without retrying an older readable payload. Melodee rejects foreign preferences and can immediately save its defaults without a question. X0X can reset its complete project if a required sound, pattern, song, motion or preference component cannot load. Repeated PIGEON writes can remove both original copies, so returning to the old firmware is not an undo.",
  "before_leaving": "Before leaving PIGEON, download a bank backup and a full-session backup. A bank larger than roughly 236 KiB uses space normally occupied by firmware. Installing a standard-layout firmware overwrites that portion of the bank; when you return, PIGEON checks the entire bank and rejects both songs and the drum kit if any used part was changed. PIGEON’s own compatible installer deliberately skips those sample areas. Even a smaller bank has no survival guarantee because other firmwares can write its audio, chops, projects or preferences at start-up, during use or when saving.",
  "overwrites_previous": [
   {
    "from": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "stock settings (and possibly patterns)",
     "stock presets (128, banks A-D)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): stock settings (and possibly patterns); stock presets (128, 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": "CSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, button calibration, favourites, MIDI LEARN map",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "kept: PIGEON can read it"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the autosave (the music as you left it)",
      "effect": "changed to the new format: the next save replaces the original sounds with PIGEON's sampler-track setup; Felucca can still read the project format, but switching back does not keep everything. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup",
      "ways": [
       {
        "way": "automatically, only at its first start unless RESTORE LAST is off",
        "effect": "changed to the new format: the next save replaces the original sounds with PIGEON's sampler-track setup; Felucca can still read the project format, but switching back does not keep everything. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "project slot A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save replaces the original sounds with PIGEON's sampler-track setup; Felucca can still read the project format, but switching back does not keep everything. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save replaces the original sounds with PIGEON's sampler-track setup; Felucca can still read the project format, but switching back does not keep everything. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save replaces the original sounds with PIGEON's sampler-track setup; Felucca can still read the project format, but switching back does not keep everything. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "project slot B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save replaces the original sounds with PIGEON's sampler-track setup; Felucca can still read the project format, but switching back does not keep everything. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save replaces the original sounds with PIGEON's sampler-track setup; Felucca can still read the project format, but switching back does not keep everything. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save replaces the original sounds with PIGEON's sampler-track setup; Felucca can still read the project format, but switching back does not keep everything. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "project slot C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save replaces the original sounds with PIGEON's sampler-track setup; Felucca can still read the project format, but switching back does not keep everything. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save replaces the original sounds with PIGEON's sampler-track setup; Felucca can still read the project format, but switching back does not keep everything. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save replaces the original sounds with PIGEON's sampler-track setup; Felucca can still read the project format, but switching back does not keep everything. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "project slot D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save replaces the original sounds with PIGEON's sampler-track setup; Felucca can still read the project format, but switching back does not keep everything. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save replaces the original sounds with PIGEON's sampler-track setup; Felucca can still read the project format, but switching back does not keep everything. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save replaces the original sounds with PIGEON's sampler-track setup; Felucca can still read the project format, but switching back does not keep everything. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "FM6 patches of the FM6 user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user presets 1-16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user presets 17-32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON keeps stored but does not show FM6 patches of the FM6 user presets until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches.",
     "PIGEON reads user sample slot USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio.",
     "PIGEON reads user sample slot USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio.",
     "PIGEON reads user sample slot USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio.",
     "PIGEON keeps stored but does not show user presets 1-16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user presets 17-32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON reads settings, button calibration, favourites, MIDI LEARN map until you write over the saved data. Shared preferences can mean different things. Choices this firmware cannot use are changed to ones it supports."
    ],
    "owner_text": "At risk by itself: settings, button calibration, favourites, MIDI LEARN map. At risk by itself, under a condition: user sample slot USR1; the autosave (the music as you left it) (changed to the new format: the next save replaces the original sounds with PIGEON's sampler-track setup; Felucca can still read the project format, but switching back does not keep everything. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup). At risk when you act: project slot A; project slot B; project slot C; project slot D; FM6 patches of the FM6 user presets; user sample slot USR2; user sample slot USR3; user presets 1-16; user presets 17-32. PIGEON keeps stored but does not show FM6 patches of the FM6 user presets until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches. PIGEON reads user sample slot USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio. PIGEON reads user sample slot USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio. PIGEON reads user sample slot USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio. PIGEON keeps stored but does not show user presets 1-16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user presets 17-32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON reads settings, button calibration, favourites, MIDI LEARN map until you write over the saved data. Shared preferences can mean different things. Choices this firmware cannot use are changed to ones it supports.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloop",
    "name": "SLOOP",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 patch bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the music in progress (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR4",
      "effect": "damaged (part written over)",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON reads user sample slot USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user sample slot USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user sample slot USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON keeps stored but does not show user sounds U01-U16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user sounds U17-U32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them."
    ],
    "owner_text": "At risk by itself: FM6 patch bank B1-B27; settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk by itself, under a condition: user sample slot USR1. At risk when you act: song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project); the music in progress (autosave); user sample slot USR2; user sample slot USR3; user sample slot USR4 (damaged (part written over)); user sounds U01-U16; user sounds U17-U32. PIGEON reads user sample slot USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user sample slot USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user sample slot USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON keeps stored but does not show user sounds U01-U16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user sounds U17-U32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "x0x",
    "name": "X0X",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the whole X0X project (settings, sound, all 32 patterns, song, knob motion)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "break loops slot 1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "break loops slot 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "break loops slot 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "X0X button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON reads break loops slot 1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads break loops slot 2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads break loops slot 3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same."
    ],
    "owner_text": "At risk by itself: the whole X0X project (settings, sound, all 32 patterns, song, knob motion). At risk by itself, under a condition: break loops slot 1. At risk when you act: break loops slot 2; break loops slot 3; X0X button calibration. PIGEON reads break loops slot 1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads break loops slot 2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads break loops slot 3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "jiant",
    "name": "JIANT",
    "flags": "CSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, favourites, MENU options",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "kept: PIGEON can read it"
       }
      ]
     },
     {
      "object": "song 4: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "partly lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "music in progress (RESTORE LAST)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only at its first start unless RESTORE LAST is off",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patches for the FM6 user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 2: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 3: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 5: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 6: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 7: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 8: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "which song is current, every song's rows and scenes",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "JIANT RESTORE LAST OFF leaves PIGEON autosave on. JIANT ON turns it off because this setting has the opposite meaning.",
     "PIGEON keeps stored but does not show FM6 patches for the FM6 user sounds until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches.",
     "PIGEON keeps stored but does not show user sounds U01-U16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user sounds U17-U32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON reads settings, calibration, favourites, MENU options until you write over the saved data. Shared preferences can mean different things. Choices this firmware cannot use are changed to ones it supports."
    ],
    "owner_text": "At risk by itself: settings, calibration, favourites, MENU options. At risk by itself, under a condition: song 4: four sections (whole projects); music in progress (RESTORE LAST). At risk when you act: song 1 section A (a whole project); song 1 section B (a whole project); song 1 section C (a whole project); song 1 section D (a whole project); FM6 patches for the FM6 user sounds; song 2: four sections (whole projects); song 3: four sections (whole projects); song 5: four sections (whole projects); song 6: four sections (whole projects); song 7: four sections (whole projects); song 8: four sections (whole projects); which song is current, every song's rows and scenes; user sounds U01-U16; user sounds U17-U32. JIANT RESTORE LAST OFF leaves PIGEON autosave on. JIANT ON turns it off because this setting has the opposite meaning. PIGEON keeps stored but does not show FM6 patches for the FM6 user sounds until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches. PIGEON keeps stored but does not show user sounds U01-U16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user sounds U17-U32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON reads settings, calibration, favourites, MENU options until you write over the saved data. Shared preferences can mean different things. Choices this firmware cannot use are changed to ones it supports.",
    "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 U037-U054",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U289-U378",
      "effect": "partly lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "shared user presets U379-U384",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U109-U126",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U145-U288",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U073-U090",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U091-U108",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U019-U036",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U127-U144",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: shared user presets U037-U054; settings, factory favourites, calibration, saved template. At risk by itself, under a condition: project B: patterns, song, sounds, motion, recordings. At risk when you act: shared user presets U289-U378 (partly lost); shared user presets U379-U384; shared user presets U109-U126; project A: patterns, song, sounds, motion, recordings; project C: patterns, song, sounds, motion, recordings; project D: patterns, song, sounds, motion, recordings; shared user presets U145-U288; shared user presets U073-U090; shared user presets U091-U108; shared user presets U001-U018; shared user presets U019-U036; 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": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FoMni setup (pages, chord buttons, lights)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FoMni button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). At risk when you act: FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "amb",
    "name": "AMB-1",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "AMB-1 panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: AMB-1 pieces and setup. At risk when you act: AMB-1 panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "choralroot",
    "name": "ChoralRoot",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "options, playing setup and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "32 imported DX7 voices",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank A (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank B (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank C (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank D (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank E (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank F (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank G (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank H (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last session saved with a global save",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "favourite marks, chord/bass type and filter",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "128 saved sounds with their complete engine patches",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: options, playing setup and panel calibration. At risk when you act: 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 session saved with a global save; favourite marks, chord/bass type and filter; 128 saved sounds with their complete engine patches; recorded loop 1; recorded loop 2; recorded loop 3; recorded loop 4; recorded loop 5; recorded loop 6; recorded loop 7; recorded loop 8; recorded loop 9; recorded loop 10.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "ghoulbox",
    "name": "GHOULBOX",
    "flags": "CSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "kept: PIGEON can read it"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "music in progress (RESTORE LAST)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only at its first start unless RESTORE LAST is off",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patches for user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON keeps stored but does not show FM6 patches for user sounds until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches.",
     "PIGEON reads user sample slot USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio.",
     "PIGEON reads user sample slot USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio.",
     "PIGEON reads user sample slot USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio.",
     "PIGEON keeps stored but does not show user sounds 1–16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user sounds 17–32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON reads settings and panel calibration until you write over the saved data. Shared preferences can mean different things. Choices this firmware cannot use are changed to ones it supports."
    ],
    "owner_text": "At risk by itself: settings and panel calibration. At risk by itself, under a condition: user sample slot USR1; music in progress (RESTORE LAST). At risk when you act: project A; project B; project C; project D; FM6 patches for user sounds; user sample slot USR2; user sample slot USR3; user sounds 1–16; user sounds 17–32. PIGEON keeps stored but does not show FM6 patches for user sounds until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches. PIGEON reads user sample slot USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio. PIGEON reads user sample slot USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio. PIGEON reads user sample slot USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio. PIGEON keeps stored but does not show user sounds 1–16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user sounds 17–32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON reads settings and panel calibration until you write over the saved data. Shared preferences can mean different things. Choices this firmware cannot use are changed to ones it supports.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Open shared sample audio",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if the checked spots where firmware updates are prepared contain leftover data that cannot be kept for recovery, or leftover update progress can be cleared",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you install PIGEON",
        "effect": "lost"
       },
       {
        "way": "when you install or update firmware",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open device preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "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": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "octave, last selected preset and MIDI preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older stored user bank, if present (Beta4 does not store new edits)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences. At risk when you act: older stored user bank, if present (Beta4 does not store new edits).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "hortator",
    "name": "Hortator",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: the next settings save uses this firmware's format; if you switch back, your previous firmware's extra preferences may be lost or its settings may be unreadable. Only some settings are changed to the new format. Your songs are not stored in these settings. Switching back may lose settings"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "changed to the new format: the next settings save uses this firmware's format; if you switch back, your previous firmware's extra preferences may be lost or its settings may be unreadable. Only some settings are changed to the new format. Your songs are not stored in these settings. Switching back may lose settings"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "changed to the new format: the next settings save uses this firmware's format; if you switch back, your previous firmware's extra preferences may be lost or its settings may be unreadable. Only some settings are changed to the new format. Your songs are not stored in these settings. Switching back may lose settings"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "changed to the new format: the next settings save uses this firmware's format; if you switch back, your previous firmware's extra preferences may be lost or its settings may be unreadable. Only some settings are changed to the new format. Your songs are not stored in these settings. Switching back may lose settings"
       }
      ]
     },
     {
      "object": "user samples USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON reads user samples USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user samples USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user samples USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same."
    ],
    "owner_text": "At risk by itself: settings and panel calibration. At risk by itself, under a condition: user samples USR1. At risk when you act: project A; project B; project C; project D; user samples USR2; user samples USR3. PIGEON reads user samples USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user samples USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user samples USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "obervave",
    "name": "OberVave",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "pattern 1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you calibrate the panel (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ],
      "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": "automatically during use [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you calibrate the panel (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ],
      "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": "automatically during use [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you calibrate the panel (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ],
      "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": "automatically during use [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you calibrate the panel (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ],
      "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": "automatically during use [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you calibrate the panel (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ],
      "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": "automatically during use [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you calibrate the panel (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ],
      "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": "automatically during use [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you calibrate the panel (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ],
      "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": "automatically during use [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you calibrate the panel (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ],
      "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": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "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": "polly",
    "name": "Polly",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Optional QY70 style bank",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "Polly setup and channel sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 14",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "All four Polly songs",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "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 14. 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 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)"
   },
   {
    "from": "skiff",
    "name": "Skiff",
    "flags": "CSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "kept: PIGEON can read it"
       }
      ]
     },
     {
      "object": "user sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last session",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only at its first start unless RESTORE LAST is off",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its shared pattern pool]",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its shared pattern pool]",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its shared pattern pool]",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its shared pattern pool]",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its shared pattern pool]",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its shared pattern pool]",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds’ own FM6 patches",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared 64-pattern pool",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sound bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sound bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON keeps stored but does not show user sounds’ own FM6 patches until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches.",
     "PIGEON reads user sample USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user sample USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user sample USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON keeps stored but does not show user sound bank 1 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user sound bank 2 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON reads settings, calibration and favourites until you write over the saved data. Shared preferences can mean different things. Choices this firmware cannot use are changed to ones it supports."
    ],
    "owner_text": "At risk by itself: settings, calibration and favourites. At risk by itself, under a condition: user sample USR1; last session. At risk when you act: project A; project B; project C; project D; user sounds’ own FM6 patches; user sample USR2; user sample USR3; shared 64-pattern pool; user sound bank 1; user sound bank 2. PIGEON keeps stored but does not show user sounds’ own FM6 patches until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches. PIGEON reads user sample USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user sample USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user sample USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON keeps stored but does not show user sound bank 1 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user sound bank 2 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON reads settings, calibration and favourites until you write over the saved data. Shared preferences can mean different things. Choices this firmware cannot use are changed to ones it supports.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloopdx",
    "name": "sloopDX",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, song order, MIDI, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       }
      ],
      "first_way_effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
     },
     {
      "object": "section B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       }
      ],
      "first_way_effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
     },
     {
      "object": "section C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       }
      ],
      "first_way_effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
     },
     {
      "object": "section D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       }
      ],
      "first_way_effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
     },
     {
      "object": "working loop",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       }
      ],
      "first_way_effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
     },
     {
      "object": "DX7 bank 5 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user presets 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       }
      ],
      "first_way_effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
     },
     {
      "object": "user presets 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       }
      ],
      "first_way_effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
     },
     {
      "object": "DX7 bank 1 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 1 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 2 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 2 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 3 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 3 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 4 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 4 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 5 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 6 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 6 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 7 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 7 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 8 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 8 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "selected DX7 bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "MY KIT",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON keeps stored but does not show user presets 1–16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user presets 17–32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them."
    ],
    "owner_text": "At risk by itself: settings, calibration, song order, MIDI, theme and favourites. At risk by itself, under a condition: section A (sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay; other writes can also erase it); section B (sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay; other writes can also erase it); section C (sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay; other writes can also erase it); section D (sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay; other writes can also erase it); working loop (sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay; other writes can also erase it); DX7 bank 5 voices 17–32; user presets 1–16 (sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay; other writes can also erase it); user presets 17–32 (sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay; other writes can also erase it). At risk when you act: DX7 bank 1 voices 1–16; DX7 bank 1 voices 17–32; DX7 bank 2 voices 1–16; DX7 bank 2 voices 17–32; DX7 bank 3 voices 1–16; DX7 bank 3 voices 17–32; DX7 bank 4 voices 1–16; DX7 bank 4 voices 17–32; DX7 bank 5 voices 1–16; DX7 bank 6 voices 1–16; DX7 bank 6 voices 17–32; DX7 bank 7 voices 1–16; DX7 bank 7 voices 17–32; DX7 bank 8 voices 1–16; DX7 bank 8 voices 17–32; selected DX7 bank; MY KIT. PIGEON keeps stored but does not show user presets 1–16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user presets 17–32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "rainbow",
    "name": "Rainbow Mode",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed automatically: PIGEON's next settings save can change Rainbow's WRITE song; learning MIDI controls on PIGEON writes over it. Calibration and shared preferences can still be read, but the WRITE song is not kept"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "changed automatically: PIGEON's next settings save can change Rainbow's WRITE song; learning MIDI controls on PIGEON writes over it. Calibration and shared preferences can still be read, but the WRITE song is not kept"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "changed automatically: PIGEON's next settings save can change Rainbow's WRITE song; learning MIDI controls on PIGEON writes over it. Calibration and shared preferences can still be read, but the WRITE song is not kept"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "changed automatically: PIGEON's next settings save can change Rainbow's WRITE song; learning MIDI controls on PIGEON writes over it. Calibration and shared preferences can still be read, but the WRITE song is not kept"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the last session in the full version of Felucca",
      "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup",
      "ways": [
       {
        "way": "automatically, only at its first start unless RESTORE LAST is off",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON keeps stored but does not show your old FM6 bank (B1–B27) until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches.",
     "PIGEON keeps stored but does not show the FM6 patches used by the thirty-two user sounds until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches.",
     "PIGEON reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio.",
     "PIGEON reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio.",
     "PIGEON reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio.",
     "PIGEON keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them."
    ],
    "owner_text": "At risk by itself: Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk by itself, under a condition: User sample USR1 and any slice positions you set in SLICE; the last session in the full version of Felucca (changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup). At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE; user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation. PIGEON keeps stored but does not show your old FM6 bank (B1–B27) until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches. PIGEON keeps stored but does not show the FM6 patches used by the thirty-two user sounds until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches. PIGEON reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio. PIGEON reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio. PIGEON reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio. PIGEON keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "duell",
    "name": "DUELL beta",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "last working music",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings and panel setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved patches",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M01–M02",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M03–M04",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M05–M06",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M07–M08",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user wavetable USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user wavetable USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user wavetable USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M09–M10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M11–M12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M13–M14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M15–M16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "patterns P01–P06",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "patterns P07–P12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "patterns P13–P16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: last working music; settings and panel setup. At risk by itself, under a condition: saved patches. At risk when you act: multis M01–M02; multis M03–M04; multis M05–M06; multis M07–M08; user wavetable USR1; user wavetable USR2; user wavetable USR3; multis M09–M10; multis M11–M12; multis M13–M14; multis M15–M16; patterns P01–P06; patterns P07–P12; patterns P13–P16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fimba",
    "name": "FiMba-1 beta",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FiMba-1 beta sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FiMba-1 beta panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FiMba-1 beta sound and playing setup. At risk when you act: FiMba-1 beta panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "maku",
    "name": "MAKU",
    "flags": "CSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "kept: PIGEON can read it"
       }
      ]
     },
     {
      "object": "inherited user sample 1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "up to sixteen liked worlds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only at its first start unless RESTORE LAST is off",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "inherited project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "inherited project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "inherited project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "inherited FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited user sample 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited user sample 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON keeps inherited FM6 patches for user presets in backups, but does not play them. Writing over that bank can lose those patches.",
     "PIGEON reads inherited user sample 1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads inherited user sample 2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads inherited user sample 3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON keeps stored but does not show inherited user preset bank 1 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show inherited user preset bank 2 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON reads settings and calibration until you write over the saved data. Some saved preferences mean different things in PIGEON. For choices PIGEON cannot use, it uses settings it supports."
    ],
    "owner_text": "At risk by itself: settings and calibration. At risk by itself, under a condition: inherited user sample 1; up to sixteen liked worlds. At risk when you act: inherited project A; inherited project B; inherited project C; inherited project D; inherited FM6 patches for user presets; inherited user sample 2; inherited user sample 3; inherited user preset bank 1; inherited user preset bank 2. PIGEON keeps inherited FM6 patches for user presets in backups, but does not play them. Writing over that bank can lose those patches. PIGEON reads inherited user sample 1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads inherited user sample 2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads inherited user sample 3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON keeps stored but does not show inherited user preset bank 1 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show inherited user preset bank 2 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON reads settings and calibration until you write over the saved data. Some saved preferences mean different things in PIGEON. For choices PIGEON cannot use, it uses settings it supports.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fart",
    "name": "Fart Machine One",
    "flags": "S",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "learned button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk when you act: learned button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "chord",
    "name": "fm1-chord",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel calibration, four chord preset setups and the current chord setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "uploaded sample USR1 and optional SLICE markers",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chord preset P1: full synth project",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chord preset P2: full synth project",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chord preset P3: full synth project",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chord preset P4: full synth project",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "uploaded sample USR2 and optional SLICE markers",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "uploaded sample USR3 and optional SLICE markers",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1-16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 17-32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON keeps stored but does not show FM6 bank B1-B27 until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches.",
     "PIGEON reads uploaded sample USR1 and optional SLICE markers until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio.",
     "PIGEON reads uploaded sample USR2 and optional SLICE markers until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio.",
     "PIGEON reads uploaded sample USR3 and optional SLICE markers until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio.",
     "PIGEON keeps stored but does not show user sounds 1-16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user sounds 17-32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them."
    ],
    "owner_text": "At risk by itself: settings, panel calibration, four chord preset setups and the current chord setup. At risk by itself, under a condition: uploaded sample USR1 and optional SLICE markers. At risk when you act: chord preset P1: full synth project; chord preset P2: full synth project; chord preset P3: full synth project; chord preset P4: full synth project; FM6 bank B1-B27; uploaded sample USR2 and optional SLICE markers; uploaded sample USR3 and optional SLICE markers; user sounds 1-16; user sounds 17-32. PIGEON keeps stored but does not show FM6 bank B1-B27 until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches. PIGEON reads uploaded sample USR1 and optional SLICE markers until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio. PIGEON reads uploaded sample USR2 and optional SLICE markers until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio. PIGEON reads uploaded sample USR3 and optional SLICE markers until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio. PIGEON keeps stored but does not show user sounds 1-16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user sounds 17-32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloopbanks",
    "name": "SLOOP DX7 Banks",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 patches B1–B27",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, synthesized drum kits and DX-bank setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "working loop",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR4",
      "effect": "damaged (part written over)",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "DX7 bank 1 (32 voices)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 2 (32 voices)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 3 (32 voices)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 4 (32 voices)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 5 (32 voices)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 6 (32 voices)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 7 (32 voices)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 8 (32 voices)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 9 (32 voices)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 10 (32 voices)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 11 (32 voices)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 12 (32 voices)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "After PIGEON replaces DX7 Banks’ saved settings, returning to DX7 Banks erases DX banks 1–8 at its first start without asking, including your own banks 5–8. Back up your DX banks before switching.",
     "PIGEON reads user sample USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user sample USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user sample USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON keeps stored but does not show user sounds 1–16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user sounds 17–32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them."
    ],
    "owner_text": "At risk by itself: FM6 patches B1–B27; settings, calibration, song order, synthesized drum kits and DX-bank setup. At risk by itself, under a condition: user sample USR1. At risk when you act: section A; section B; section C; section D; working loop; user sample USR2; user sample USR3; user sample USR4 (damaged (part written over)); DX7 bank 1 (32 voices); DX7 bank 2 (32 voices); DX7 bank 3 (32 voices); DX7 bank 4 (32 voices); DX7 bank 5 (32 voices); DX7 bank 6 (32 voices); DX7 bank 7 (32 voices); DX7 bank 8 (32 voices); DX7 bank 9 (32 voices); DX7 bank 10 (32 voices); DX7 bank 11 (32 voices); DX7 bank 12 (32 voices); user sounds 1–16; user sounds 17–32. After PIGEON replaces DX7 Banks’ saved settings, returning to DX7 Banks erases DX banks 1–8 at its first start without asking, including your own banks 5–8. Back up your DX banks before switching. PIGEON reads user sample USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user sample USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user sample USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON keeps stored but does not show user sounds 1–16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user sounds 17–32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fumi",
    "name": "FuMi-1",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FuMi-1 button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FuMi-1 sound and playing setup. At risk when you act: FuMi-1 button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "jangada",
    "name": "Jangada",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 voices B1-B16",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "preferences, calibration and MIDI LEARN map",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "working music (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON reads user samples USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user samples USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user samples USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same."
    ],
    "owner_text": "At risk by itself: FM6 voices B1-B16; preferences, calibration and MIDI LEARN map. At risk by itself, under a condition: user samples USR1. At risk when you act: project 1; project 2; project 3; project 4; working music (autosave); user samples USR2; user samples USR3; user sounds U01-U16; user sounds U17-U32. PIGEON reads user samples USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user samples USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user samples USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "waveloop",
    "name": "WaveLoop FM-1",
    "flags": "CSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "kept: PIGEON can read it"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "kept: PIGEON can read it"
       }
      ]
     },
     {
      "object": "user sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions you set for USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "song 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "song 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "last session saved for the next start",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "FM6 patches and controls for each drum in user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions you set for USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song order and selection",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON keeps stored but does not show FM6 patches and controls for each drum in user sounds until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches.",
     "PIGEON reads user sample USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user sample USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON keeps stored but does not show user sounds 1–16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user sounds 17–32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON reads settings, calibration and favourites until you write over the saved data. Shared preferences can mean different things. Choices this firmware cannot use are changed to ones it supports."
    ],
    "owner_text": "At risk by itself: settings, calibration and favourites. At risk by itself, under a condition: user sample USR1; slice positions you set for USR1. At risk when you act: song 1; song 2; song 3; last session saved for the next start; FM6 patches and controls for each drum in user sounds; user sample USR2; slice positions you set for USR2; song 4; song 5; song 6; song 7; song 8; song 9; song 10; song 11; song 12; song order and selection; user sounds 1–16; user sounds 17–32. PIGEON keeps stored but does not show FM6 patches and controls for each drum in user sounds until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches. PIGEON reads user sample USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user sample USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON keeps stored but does not show user sounds 1–16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user sounds 17–32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON reads settings, calibration and favourites until you write over the saved data. Shared preferences can mean different things. Choices this firmware cannot use are changed to ones it supports.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "orbit",
    "name": "ORBIT",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "saved section A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you calibrate the panel (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send preferences from the web editor (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "saved section B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you calibrate the panel (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send preferences from the web editor (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "saved section C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you calibrate the panel (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send preferences from the web editor (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "saved section D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you calibrate the panel (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send preferences from the web editor (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "working music kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you calibrate the panel (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send preferences from the web editor (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "USER sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "USER sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "FM6 bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, SYN1-SYN4 kits and MIDI preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample slot USR4",
      "effect": "damaged (part written over)",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON reads sample slot USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads sample slot USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads sample slot USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same."
    ],
    "owner_text": "At risk by itself: saved section A (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); saved section B (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); saved section C (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); saved section D (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); working music kept by autosave (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); USER sounds U01-U16 (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); USER sounds U17-U32 (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); FM6 bank B1-B27; settings, calibration, song order, SYN1-SYN4 kits and MIDI preferences. At risk by itself, under a condition: sample slot USR1. At risk when you act: sample slot USR2; sample slot USR3; sample slot USR4 (damaged (part written over)). PIGEON reads sample slot USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads sample slot USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads sample slot USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "floyd",
    "name": "SLOOP Floyd FM",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON reads user sample slot USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user sample slot USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user sample slot USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON keeps stored but does not show user sounds U01–U16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user sounds U17–U32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them."
    ],
    "owner_text": "At risk by itself: settings, panel calibration and song order. At risk by itself, under a condition: user sample slot USR1. At risk when you act: song section A; song section B; song section C; song section D; the working loop kept by autosave; user sample slot USR2; user sample slot USR3; user sounds U01–U16; user sounds U17–U32. PIGEON reads user sample slot USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user sample slot USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user sample slot USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON keeps stored but does not show user sounds U01–U16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user sounds U17–U32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "winampfm",
    "name": "winampFM Synth",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, panel calibration, song order, SYN kits and MIDI",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section A (whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section B (whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section C (whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section D (whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "working music kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample USR4",
      "effect": "damaged (part written over)",
      "ways": [
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "user sounds 1-16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 17-32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON reads sample USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads sample USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads sample USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON keeps stored but does not show user sounds 1-16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user sounds 17-32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them."
    ],
    "owner_text": "At risk by itself: FM6 bank B1-B27; settings, panel calibration, song order, SYN kits and MIDI. At risk by itself, under a condition: sample USR1. At risk when you act: section A (whole project); section B (whole project); section C (whole project); section D (whole project); working music kept by autosave; sample USR2; sample USR3; sample USR4 (damaged (part written over)); user sounds 1-16; user sounds 17-32. PIGEON reads sample USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads sample USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads sample USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON keeps stored but does not show user sounds 1-16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user sounds 17-32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "bubba",
    "name": "Bubba Machine (beta)",
    "flags": "CS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "sixteen six-track patterns",
      "effect": "some or all lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "some or all lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "some or all lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "some or all lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "some or all lost"
       }
      ]
     },
     {
      "object": "song order and four scenes",
      "effect": "some or all lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "some or all lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "some or all lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "some or all lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "some or all lost"
       }
      ]
     },
     {
      "object": "eight saved sampler takes",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "some or all lost"
       }
      ]
     },
     {
      "object": "twelve uploaded sounds or DX7 banks",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "some or all lost"
       }
      ]
     },
     {
      "object": "screen language pack",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "system preferences and last pattern",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself, under a condition: sixteen six-track patterns (some or all lost); song order and four scenes (some or all lost). At risk when you act: eight saved sampler takes; twelve uploaded sounds or DX7 banks; screen language pack; system preferences and last pattern.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "salt",
    "name": "Felucca [Salt]",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "screen preferences, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "user sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON reads user sample USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user sample USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads user sample USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON keeps stored but does not show user sounds U01-U16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user sounds U17-U32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them."
    ],
    "owner_text": "At risk by itself: screen preferences, calibration and favourites. At risk by itself, under a condition: user sample USR1. At risk when you act: project 1; project 2; project 3; project 4; user sample USR2; user sample USR3; user sounds U01-U16; user sounds U17-U32. PIGEON reads user sample USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user sample USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads user sample USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON keeps stored but does not show user sounds U01-U16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user sounds U17-U32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm1move",
    "name": "FM1 Move",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 bank B1–B27",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you calibrate the panel (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send preferences from the web editor (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you calibrate the panel (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send preferences from the web editor (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "the working project kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you calibrate the panel (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send preferences from the web editor (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "settings, calibration, SYN kits and stored MIDI mappings",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON reads sample slot USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads sample slot USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON reads sample slot USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same.",
     "PIGEON keeps stored but does not show user sounds U01–U16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user sounds U17–U32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them."
    ],
    "owner_text": "At risk by itself: FM6 bank B1–B27; project 1 (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); project 2 (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); the working project kept by autosave (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); settings, calibration, SYN kits and stored MIDI mappings. At risk by itself, under a condition: sample slot USR1. At risk when you act: sample slot USR2; sample slot USR3; user sounds U01–U16; user sounds U17–U32. PIGEON reads sample slot USR1 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads sample slot USR2 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON reads sample slot USR3 until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. PIGEON keeps stored but does not show user sounds U01–U16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user sounds U17–U32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm1quest",
    "name": "FM1 Quest",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel mapping, song order and Quest preferences/progress",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "working music (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "Piano Hero P1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON reads sample USR1 until you write over the saved data. Only sample slots that start in the same place in storage can be read. Other small sample slots are not moved to matching slots.",
     "PIGEON keeps stored but does not show user sounds U01–U16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user sounds U17–U32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them."
    ],
    "owner_text": "At risk by itself: settings, panel mapping, song order and Quest preferences/progress. At risk by itself, under a condition: sample USR2. At risk when you act: song section A; song section B; song section C; song section D; working music (autosave); sample USR1; sample USR3; Piano Hero P1; Piano Hero P2; Piano Hero P3; Piano Hero P4; Piano Hero P5; Piano Hero P6; FM Hero H1; FM Hero H2; FM Hero H3; FM Hero H4; FM Hero H5; FM Hero H6; user sounds U01–U16; user sounds U17–U32. PIGEON reads sample USR1 until you write over the saved data. Only sample slots that start in the same place in storage can be read. Other small sample slots are not moved to matching slots. PIGEON keeps stored but does not show user sounds U01–U16 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user sounds U17–U32 until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "grooveos",
    "name": "Groove OS",
    "flags": "?",
    "weakest_grade": null,
    "at_risk": [],
    "possibly_at_risk": [
     "Groove project slot 1",
     "Groove project slot 2",
     "Groove project slot 3",
     "Groove resume autosave",
     "Groove sound bank A",
     "Groove sound bank B",
     "Groove sound bank C",
     "Groove sound bank D",
     "Groove custom drum sounds and kits",
     "Groove device preferences",
     "Groove crash reports"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Groove OS does not publish where or how it stores saved work, so data may be lost even where we cannot confirm shared storage. Before switching, use export all on its Projects page to save every project and the autosave. Use Save a backup on Your own sounds too: project exports remember the sounds but leave out the audio. Use Save a safety copy on Your FM-1 for the banks, songs, autosave and samples. Keep these files on your computer. Sound banks, custom sounds, settings and crash reports may be lost."
    ],
    "owner_text": "Possibly at risk (layout reported or inferred): Groove project slot 1; Groove project slot 2; Groove project slot 3; Groove resume autosave; Groove sound bank A; Groove sound bank B; Groove sound bank C; Groove sound bank D; Groove custom drum sounds and kits; Groove device preferences; Groove crash reports. Groove OS does not publish where or how it stores saved work, so data may be lost even where we cannot confirm shared storage. Before switching, use export all on its Projects page to save every project and the autosave. Use Save a backup on Your own sounds too: project exports remember the sounds but leave out the audio. Use Save a safety copy on Your FM-1 for the banks, songs, autosave and samples. Keep these files on your computer. Sound banks, custom sounds, settings and crash reports may be lost.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ]
 },
 "disagreements": [
  {
   "topic": "SAVE also acts outside Patterns",
   "docs_say": "The guide directs owners to Patterns before saving and calls SAVE hold undo.",
   "source_says": "On any ordinary sampler page, SAVE first attempts to overwrite the selected A–D phrase on press without asking; a short release opens Patterns and a hold later invokes track undo, which cannot undo that flash save.",
   "docs_ref": {
    "kind": "doc",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "docs/PIGEON_CONTROLS.md",
    "lines": "41-43",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/docs/PIGEON_CONTROLS.md#L41-L43"
   },
   "source_ref": {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_input.c",
    "lines": "1693-1698",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1693-L1698"
   }
  },
  {
   "topic": "Launch tools section knob",
   "docs_say": "The section display is presented among four parameter cards.",
   "source_says": "KNOB 4 on Launch tools has no section-selection handler; use Arrangement KNOB 1 or PRESETS on Arrangement.",
   "docs_ref": {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_ui.c",
    "lines": "633-636",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L633-L636"
   },
   "source_ref": {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_arrange.c",
    "lines": "132-145",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L132-L145"
   }
  },
  {
   "topic": "FX hint on advanced steps",
   "docs_say": "The advanced-step page advertises FX SYNC.",
   "source_says": "FX from advanced steps opens ordinary FX amounts; Speed sync is reached from Tempo tools.",
   "docs_ref": {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_ui.c",
    "lines": "592-597",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L592-L597"
   },
   "source_ref": {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_input.c",
    "lines": "1352-1389",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1352-L1389"
   }
  },
  {
   "topic": "Calibration access",
   "docs_say": "The licence guide describes holding HOME for the menu.",
   "source_says": "PIGEON opens Settings with a HOME press on waveform or kit; a hold has no separate menu action.",
   "docs_ref": {
    "kind": "doc",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "LICENSING.md",
    "lines": "81-82",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/LICENSING.md#L81-L82"
   },
   "source_ref": {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui.c",
    "lines": "726-736",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L726-L736"
   }
  },
  {
   "topic": "The Step Pitch + Timing cursor hint",
   "docs_say": "The page itself labels PRESETS as its step selector.",
   "source_says": "PRESETS changes the song chop on this page; KNOB 4 actually selects its step, and stopped unarmed keys are suppressed rather than toggled.",
   "docs_ref": {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_ui.c",
    "lines": "592-597",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L592-L597"
   },
   "source_ref": {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_input.c",
    "lines": "1853-1859",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1853-L1859"
   }
  },
  {
   "topic": "Temporary FX shortcut",
   "docs_say": "The README lists temporary effects that return when released.",
   "source_says": "Pressing LFO leaves FX immediately; the remaining temporary-FX handler is reachable by holding LFO first and then pressing FX before turning its knobs.",
   "docs_ref": {
    "kind": "doc",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "README.md",
    "lines": "25-28",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/README.md#L25-L28"
   },
   "source_ref": {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_input.c",
    "lines": "1385-1389",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1385-L1389"
   }
  },
  {
   "topic": "Sequence shortcut lane hints",
   "docs_say": "The shortcut screen advertises black keys for lane selection.",
   "source_says": "The kit uses the sample engine, so the inherited drum-engine test excludes its lane keys and drum-specific tools; only six whole-track tools work.",
   "docs_ref": {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_layer.c",
    "lines": "891-894",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L891-L894"
   },
   "source_ref": {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_tools.c",
    "lines": "14-25",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_tools.c#L14-L25"
   }
  },
  {
   "topic": "Recording-page preferences need a later settings save",
   "docs_say": "The Recording page offers metronome and count-in beside automatically stored sampler preferences.",
   "source_says": "Those two knobs update recording settings in memory without requesting a settings write; close Settings to persist them, while the other two knobs mark sampler metadata dirty.",
   "docs_ref": {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_ui.c",
    "lines": "623-628",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L623-L628"
   },
   "source_ref": {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_ui.c",
    "lines": "182-186",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L182-L186"
   }
  },
  {
   "topic": "Ordinary REC is swallowed",
   "docs_say": "The guide says REC arms step entry on the stopped sequencer or records live during playback.",
   "source_says": "An ordinary REC tap is consumed by the retired REC layer and its returned tap is discarded; holding FX first, navigating back to the needed page and releasing a REC tap while FX remains down reaches the handler, with no hardware test of this route.",
   "docs_ref": {
    "kind": "doc",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "docs/PIGEON_CONTROLS.md",
    "lines": "82-86",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/docs/PIGEON_CONTROLS.md#L82-L86"
   },
   "source_ref": {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_input.c",
    "lines": "1531-1536",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
   }
  },
  {
   "topic": "Live quantization while unarmed",
   "docs_say": "The guide describes quantization as a live-recording setting.",
   "source_says": "The pending-note handler applies it whenever transport plays, without checking whether the track is armed; a full pending queue drops the new input.",
   "docs_ref": {
    "kind": "doc",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "docs/PIGEON_CONTROLS.md",
    "lines": "13-14",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/docs/PIGEON_CONTROLS.md#L13-L14"
   },
   "source_ref": {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/seq.c",
    "lines": "630-639",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
   }
  }
 ],
 "not_mapped": [
  "The stopped armed-key cursor display is unsafe beyond step 16: ui_input.c:348–351 indexes a sixteen-element white-key table with the full cursor, although sequence length can reach 64; its resulting LED picture is not predictable from a valid key index.",
  "No physical FM-1 checks were performed; all entries come from reading v0.3.1 source.",
  "Bluetooth, live line recording and resampling are not available in the shipped sampler profile."
 ],
 "storage_fragment": "refresh/work/pigeon.storage.json",
 "scope_note": "Page modes describe what the screen and knobs do; k_ modes describe simultaneous key roles, with recording, step editing and held GLO/SEQ taking precedence over ordinary song or kit playing; any rows are defaults overridden by a more specific mode.",
 "saving_note": {
  "phrase": "SAVE writes the selected A–D project on press while stopped and silent, without a confirmation or flash undo; its short release opens Patterns and its hold later invokes track undo, so holding SAVE can save an edit before undoing it in memory.",
  "chops": "Chop boundaries, pitch, envelope, layouts, compressors, pad settings, end timing, live quantization, song choke and rolls save together after at least one second without a new metadata revision, with transport stopped and voices silent; a missing writable metadata area reports that edits were not saved and a write error retries later.",
  "last_session": "RESTORE LAST defaults on and saves a changed project after ten quiet seconds with playback stopped, released keys and buttons, silent voices and no transfer, with at least sixty seconds between successful saves; switching off does not flush pending edits.",
  "recording_preferences": "Metronome and count-in changes on Recording take effect in memory but do not request a settings save themselves; close Settings afterward to save them.",
  "limits": "Chops stop at 32; split also needs enough audio on both sides; arrangement insertion stops at sixteen sections; steps stop at four notes and a fifth note is refused; pitch and gate locks report a full lock store rather than adding a lock; sending a bank larger than negotiated capacity is rejected before erasing it.",
  "source": [
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_input.c",
    "lines": "1627-1632",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1627-L1632"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_input.c",
    "lines": "1693-1698",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1693-L1698"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_arrange.c",
    "lines": "98-110",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L98-L110"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_store.c",
    "lines": "131-142",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_store.c#L131-L142"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/project.c",
    "lines": "1213-1231",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/project.c#L1213-L1231"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_ui.c",
    "lines": "182-186",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L182-L186"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui.c",
    "lines": "100-105",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui.c#L100-L105"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko.c",
    "lines": "148-178",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L148-L178"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_arrange.c",
    "lines": "112-118",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_arrange.c#L112-L118"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_state.h",
    "lines": "40-52",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L40-L52"
   }
  ]
 },
 "timing_note": {
  "sample_end": "Outside a running phrase chain, sample-end timing waits for the voices triggered by the step to finish, disabling their loop/latch for that trigger; missing or stolen voices count as finished, and a step without tracked voices waits one tempo step; pattern-loop and arrangement playback use tempo timing.",
  "speed_sync": "Speed sync changes pitch together with speed within half to double the original rate; changing chop boundaries alone does not recapture the reference, so adjust a sync control to recapture it.",
  "source": [
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/seq.c",
    "lines": "1266-1303",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L1266-L1303"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/seq.c",
    "lines": "1506-1510",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L1506-L1510"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_state.h",
    "lines": "112-120",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_state.h#L112-L120"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_ui.c",
    "lines": "140-148",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_ui.c#L140-L148"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/seq.c",
    "lines": "630-639",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L630-L639"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/seq.c",
    "lines": "667-670",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/seq.c#L667-L670"
   }
  ],
  "quantization": "Live quantization also delays played keys while playback runs with the track unarmed; if its pending-note queue is full, the new input is dropped."
 },
 "sample_note": {
  "text": "Both songs and the sixteen drum pads share 496 KiB of audio capacity; songs can use mono MP3 or IMA ADPCM, with up to 32 chops each and an alternate chop layout per song, while direct line recording, resampling and compressed reverse playback are unavailable. Splitting, joining, moving and swapping chops change key assignments rather than sequence note numbers, so existing patterns may sound different afterward.",
  "source": [
   {
    "kind": "doc",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "README.md",
    "lines": "10-38",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/README.md#L10-L38"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko_bank.c",
    "lines": "61-99",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko_bank.c#L61-L99"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko.c",
    "lines": "148-198",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L148-L198"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ko.c",
    "lines": "285-289",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ko.c#L285-L289"
   }
  ]
 },
 "rec_fault_note": {
  "text": "In v0.3.1 source, REC alone does nothing: its retired held-button handler consumes the tap. For stopped entry, hold FX, press SEQ, tap and release REC while FX remains down, then release FX. For live recording, hold FX while playback runs, tap and release REC, then release FX. These routes are traced in source, not tested on a unit. The usual REC save and copy shortcuts also require FX to own the held-button state before navigating to their page. Holding LFO does not establish that state.",
  "source": [
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_input.c",
    "lines": "1531-1536",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1531-L1536"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_layer.c",
    "lines": "95-107",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L95-L107"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_input.c",
    "lines": "1303-1317",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1303-L1317"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_layer.c",
    "lines": "197-205",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L197-L205"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_input.c",
    "lines": "1685-1689",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1685-L1689"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_input.c",
    "lines": "1741-1744",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1741-L1744"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_input.c",
    "lines": "595-631",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L595-L631"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_input.c",
    "lines": "1607-1608",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_input.c#L1607-L1608"
   },
   {
    "kind": "source",
    "repo": "TheShrimpBlimp/pigeon",
    "ref": "v0.3.1",
    "commit": "113f6e638626a7738c48199fef3bb78f36a8a51c",
    "path": "firmware/src/ui_layer.c",
    "lines": "12-24",
    "url": "https://github.com/TheShrimpBlimp/pigeon/blob/113f6e638626a7738c48199fef3bb78f36a8a51c/firmware/src/ui_layer.c#L12-L24"
   }
  ]
 },
 "refresh_check_fixes": [
  {
   "round": 1,
   "error": "1 installing another firmware damages larger sample banks",
   "fixed": "Replaced survival wording with program-area bank loss, whole-bank rejection on return and backup requirement; recorded threshold and extents in storage.",
   "at": "switching_note.kept_on_unit/lost/when_you_leave; pigeon.sample_bank.switching_risk; guide switching section"
  },
  {
   "round": 1,
   "error": "4 EDIT acts before tail preview",
   "fixed": "Added the initial page change, FX reset or stopped-step clear to every song-bank tail-preview entry.",
   "at": "controls.key_*: k_song/k_song_later press_while_holding:button_edit; matching guide rows"
  },
  {
   "round": 1,
   "error": "5 power-on recovery and its flashes",
   "fixed": "Appended OCT−-only recovery and the three-short/one-long light meanings; expanded the existing boot mode.",
   "at": "controls.switch_power[1]; appended lights.key_lights/button_lfo/button_oct_down entries; modes.boot; guide recovery section"
  },
  {
   "round": 1,
   "error": "6 backup button names",
   "fixed": "Used the actual Read device bank and Back up full session labels and distinguished device reads from local downloads.",
   "at": "switching_note.back_up_first; storage backup_note/map_switching_note.backup; guide backup text"
  },
  {
   "round": 1,
   "error": "7 one-shot overrides held looping",
   "fixed": "Corrected all 32 song-key hold entries so LOOP does not imply repetition in ONE-SHOT mode.",
   "at": "controls.key_*: k_song/k_song_later hold; matching guide rows"
  },
  {
   "round": 1,
   "error": "8 REC idle light under INV",
   "fixed": "Made unarmed REC dark in INV rather than inheriting the ordinary inactive-button inversion.",
   "at": "lights.button_rec[0]; guide REC lights"
  },
  {
   "round": 1,
   "error": "9 OCT− Back light on Information and About",
   "fixed": "Included the two information pages in the existing lit meaning.",
   "at": "lights.button_oct_down[1]; guide OCT− lights"
  },
  {
   "round": 1,
   "error": "3 TUNE and MIDI IN persistence",
   "fixed": "Corrected eight settings-knob entries and storage notes: project save/autosave persists these values; closing Settings saves other preferences. The MIDI screen and mode now share one description.",
   "at": "controls.encoder_knob1..4 settings_audio/settings_midi; pigeon.settings.notes; matching guide tables"
  },
  {
   "round": 1,
   "error": "10 OCT− chooses the previous value",
   "fixed": "Replaced advances with steps to the previous value in all five Settings contexts.",
   "at": "controls.button_oct_down[11..15]; matching guide rows"
  },
  {
   "round": 1,
   "error": "11 release label names the job",
   "fixed": "Renamed MENU RELEASE to RELEASE on all 27 keys, retaining behavior and positions.",
   "at": "controls.key_*: k_settings release short_label"
  },
  {
   "round": 1,
   "error": "12 SAVE disagreement source lines",
   "fixed": "Pinned the disagreement to the physical press dispatch that calls the save handler.",
   "at": "disagreements[0].source_ref"
  },
  {
   "round": 1,
   "error": "2 project writes omit X0X sloopDX and Open",
   "fixed": "Added all three and X0X whole-project reset risk; rebuilt per-trigger owner warnings from all foreign overlap rows, including autosave, settings, calibration, samples, chop saves and archive restore. Installer cleanup and return-trip warnings also name affected work from the fragment rows.",
   "at": "switching_note.pattern_overwrites and owner warnings; storage project_a..d.foreign_write_note/owner_warning_coverage_round1; guide switching section"
  },
  {
   "round": 1,
   "error": "cleanup duplicate prose",
   "fixed": "Removed the duplicate MIDI description and repeated no-hardware limitation.",
   "at": "guide Settings / Midi; not_mapped"
  },
  {
   "round": 2,
   "error": "1 Legacy sample transfers and stock voices",
   "fixed": "Removed stock user voices from the older slot-send/erase warning and corrected its stock coverage row; the bank-send warning still includes those voices.",
   "at": "switching_note.sample_overwrites; pigeon.storage.json owner_warning_coverage_round1.legacy_sample_send_or_erase; pigeon.md"
  },
  {
   "round": 2,
   "error": "2 Recovery keyboard flashes",
   "fixed": "Named D4 and C♯5 as the two flashing keyboard LEDs and added the LED-position source; LFO and OCT− entries retain their existing descriptions.",
   "at": "lights.key_lights[11]; lights.key_lights[12]; pigeon.md"
  },
  {
   "round": 2,
   "error": "3 Copied recovery instruction",
   "fixed": "Rephrased the boot-mode instruction in our own words without changing the gesture.",
   "at": "modes[id=boot].how_to_get_there; pigeon.md"
  },
  {
   "round": 2,
   "error": "4 Calibration can skip preference writes",
   "fixed": "Made the preference write conditional on changed exported contents, stated the unchanged-write skip, and synchronized the power-on action, owner warning and storage trigger.",
   "at": "controls.switch_power[0]; switching_note.calibration_overwrites; pigeon.storage.json objects[id=pigeon.settings].written_when; pigeon.md"
  },
  {
   "round": 2,
   "error": "Not counted: repeated switching prose",
   "fixed": "Removed the embedded duplicate installation-loss paragraph and repeated table-status sentence while retaining the full loss warning and backup advice.",
   "at": "switching_note.kept_on_unit; switching_note.when_you_leave; pigeon.storage.json owner_switching_fact; pigeon.md"
  }
 ],
 "checker_disputes_refresh": []
}