{
 "firmware": "Melodee",
 "slug": "melodee",
 "author": "Kerem Kilic (Ellic Studio, @keremimo), built on Felucca by Leo Kuroshita (Hügelton Instruments)",
 "repo": "https://github.com/keremimo/melodee",
 "licence": "GPL-3.0-only",
 "closed_source": false,
 "mapped_release": "v1.4.1",
 "mapped_commit": "1cccd6970e6e60f136862f3016de58617010c01e",
 "release_date": "2026-10-15",
 "date_mapped": "2026-10-16",
 "turns_it_into": "A one-to-four-track synth and sequencer with Prophet-5, Casio CZ-1, DX7-style FM, C64 SID and 808/909/SID drums, 384 shared sound slots, 70 tunings, played-timing recording and USB audio in and out.",
 "docs": [
  {
   "title": "README.md",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md",
   "words": 11810,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated words in the source document."
  },
  {
   "title": "docs/RECORDING_PERFORMANCE.md",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RECORDING_PERFORMANCE.md",
   "words": 1054,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated words in the source document."
  },
  {
   "title": "docs/SOUND_DESIGNER.md",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/SOUND_DESIGNER.md",
   "words": 1517,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated words in the source document."
  },
  {
   "title": "docs/design/README.md",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/design/README.md",
   "words": 4548,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated words in the source document."
  },
  {
   "title": "docs/STORAGE_PLAN.md",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/STORAGE_PLAN.md",
   "words": 4057,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated words in the source document."
  },
  {
   "title": "BUILDING.md",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/BUILDING.md",
   "words": 5745,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated words in the source document."
  },
  {
   "title": "docs/RECOVERY.md",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RECOVERY.md",
   "words": 682,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated words in the source document."
  },
  {
   "title": "docs/BOOT-SAFETY.md",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/BOOT-SAFETY.md",
   "words": 1283,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated words in the source document."
  },
  {
   "title": "docs/RELEASE_1.3.1.md",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RELEASE_1.3.1.md",
   "words": 290,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated words in the source document."
  },
  {
   "title": "docs/RELEASE_1.3.2.md",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RELEASE_1.3.2.md",
   "words": 333,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated words in the source document."
  },
  {
   "title": "docs/RELEASE_1.3.3.md",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RELEASE_1.3.3.md",
   "words": 239,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated words in the source document."
  },
  {
   "title": "docs/RELEASE_1.3.4.md",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RELEASE_1.3.4.md",
   "words": 235,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated words in the source document."
  },
  {
   "title": "docs/RELEASE_1.3.5.md",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RELEASE_1.3.5.md",
   "words": 648,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated words in the source document."
  },
  {
   "title": "docs/RELEASE_1.3.6.md",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RELEASE_1.3.6.md",
   "words": 352,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated words in the source document."
  },
  {
   "title": "docs/RELEASE_1.4.0.md",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RELEASE_1.4.0.md",
   "words": 658,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated words in the source document."
  },
  {
   "title": "docs/RELEASE_1.4.1.md",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RELEASE_1.4.1.md",
   "words": 260,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated words in the source document."
  },
  {
   "title": "web/index_pkg.html",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/index_pkg.html",
   "words": 96,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated HTML text words, excluding script and style."
  },
  {
   "title": "web/manual/index.html",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/manual/index.html",
   "words": 10944,
   "read_at": "2026-10-16, 1cccd6970e6e60f136862f3016de58617010c01e (v1.4.1)",
   "word_count_method": "Whitespace-separated HTML text words, excluding script and style."
  }
 ],
 "install": {
  "hub": "https://thefirmwarehub.com/",
  "official": "https://github.com/keremimo/melodee/releases/tag/v1.4.1"
 },
 "part_id_notes": "The button printed SEL is SCL in Melodee's code and on its screens (button_sel). ALGORITHM selects the track on every page, PRESETS changes the sound on Stage, SELECT turns pages away from HOME; on HOME and with GLO held it changes the value chosen in Settings (BPM by default). Melodee learns which matrix button carries which label by HARDWARE CALIBRATION, with a default table. PLAY's second (green) LED is never driven. The two jack entries use the gesture 'press' to mean 'connected'. Reconciled to the drawing's part ids (output/tutorials/_panels/m-vave-fm1, branch fm1/panel 4027d71) on 2026-10-13 by the lead session: the drawing has no separate button lamps, so what a button's light shows moved from led_<button> to lights.button_<button> (led_play_stop_green to lights.button_play_stop with light='green'); led_key_<note> became lights.led_<note>; led_keys_all became lights.key_lights, with groups.key_lights listing the 27 key-light parts; jack_usb_c became jack_usb. Originals: _before-reconcile/.",
 "part_id_notes_source": [
  {
   "kind": "source",
   "repo": "keremimo/melodee",
   "ref": "v1.4.1",
   "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
   "path": "firmware/src/panel.c",
   "lines": "4-9",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/panel.c#L4-L9"
  },
  {
   "kind": "source",
   "repo": "keremimo/melodee",
   "ref": "v1.4.1",
   "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
   "path": "firmware/src/panel.c",
   "lines": "10-16",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/panel.c#L10-L16"
  },
  {
   "kind": "source",
   "repo": "keremimo/melodee",
   "ref": "v1.4.1",
   "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
   "path": "firmware/hal/fm1_input.h",
   "lines": "71-78",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/hal/fm1_input.h#L71-L78"
  },
  {
   "kind": "source",
   "repo": "keremimo/melodee",
   "ref": "v1.4.1",
   "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
   "path": "firmware/src/ui.c",
   "lines": "77-92",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L77-L92"
  },
  {
   "kind": "source",
   "repo": "keremimo/melodee",
   "ref": "v1.4.1",
   "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
   "path": "firmware/src/ui_input.c",
   "lines": "2407-2426",
   "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2407-L2426"
  }
 ],
 "modes": [
  {
   "id": "stage",
   "name": "Stage (HOME)",
   "how_to_get_there": "Press HOME (Melodee also starts here).",
   "what_it_is": "A row for each track in use, showing its sound, role, pattern and steps; the selected row is outlined. Below them are the selected track’s notes and waveform (drums show hits). Turning a sound knob opens its values and picture for 1.5 s.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_stage.c",
     "lines": "19-24",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L19-L24"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_stage.c",
     "lines": "62-63",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L62-L63"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_stage.c",
     "lines": "289-301",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L289-L301"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_stage.c",
     "lines": "440-481",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L440-L481"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_stage.c",
     "lines": "595-642",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L595-L642"
    }
   ]
  },
  {
   "id": "menu",
   "name": "Settings menu",
   "how_to_get_there": "Hold HOME about 0.7 s; hold it again (or OCT- on BACK) to close.",
   "what_it_is": "Device settings: colour, font, hold time, lights, USB audio and input, click and count-in, note preview, chord entry, autosave, picker popups, knob acceleration, HOME SELECT, GLO SELECT, screen off, calibration, About and sound designer.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "2098-2111",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2098-L2111"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_menu.c",
     "lines": "4-10",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_menu.c#L4-L10"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_menu.c",
     "lines": "13-24",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_menu.c#L13-L24"
    }
   ]
  },
  {
   "id": "fx_insert",
   "name": "FX 1, FX 2, FX 3",
   "how_to_get_there": "From FX, choose an occupied slot with KNOB 2 and press OCT+; SELECT also visits occupied slot pages.",
   "what_it_is": "One track effect slot at a time: mix, rate, character and tone. Choose the effect type on the FX rack.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "503-513",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L503-L513"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "254-258",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L254-L258"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1738-1769",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1738-L1769"
    }
   ]
  },
  {
   "id": "send_fx",
   "name": "SEND FX 1-3",
   "how_to_get_there": "From SHARED, choose an occupied slot with KNOB 2 and press OCT+; SELECT also visits occupied shared slot pages.",
   "what_it_is": "The shared effects’ individual pages: mix, rate, character and tone. Set each effect type on SHARED.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "510-513",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L510-L513"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "254-258",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L254-L258"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1738-1769",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1738-L1769"
    }
   ]
  },
  {
   "id": "env",
   "name": "ENV and ENV DEST (SID, DRUM)",
   "how_to_get_there": "Press ENV on a SID or DRUM track; press again for ENV DEST.",
   "what_it_is": "The track envelope (attack, decay, sustain, release) and where it goes (filter, pitch, shape).",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "514-515",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L514-L515"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "254-276",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L254-L276"
    }
   ]
  },
  {
   "id": "native_env",
   "name": "Engine envelopes (PROPHET, FM6, CZ-1)",
   "how_to_get_there": "Press ENV on a PROPHET, FM6 or CZ-1 track; each press goes to the next one.",
   "what_it_is": "The engine's own envelope pages: PROPHET filter and amp envelopes and envelope mod; FM6 EG RATE, EG LVL, PITCH EG, PITCH LV; CZ-1 the pitch, wave and amp envelopes of each line. The track ENV pages hide.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "226-242",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L226-L242"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "516-568",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L516-L568"
    }
   ]
  },
  {
   "id": "lfo",
   "name": "LFO, LFO 2, LFO DEST",
   "how_to_get_there": "Press LFO (after the engine's own LFO pages, if any).",
   "what_it_is": "The track LFO: rate, wave, phase, fade; then sync, retrigger, polarity; then amounts to pitch, filter, shape, level.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "516-518",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L516-L518"
    }
   ]
  },
  {
   "id": "mod",
   "name": "MOD",
   "how_to_get_there": "Press LFO until MOD (the last LFO page).",
   "what_it_is": "The modulation matrix: four routes, each a source, destination and amount.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "519",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L519"
    }
   ]
  },
  {
   "id": "native_lfo",
   "name": "Engine LFOs (PROPHET, FM6, CZ-1)",
   "how_to_get_there": "Press LFO on a PROPHET, FM6 or CZ-1 track.",
   "what_it_is": "The engine's own LFO pages first (PROPHET LFO and wheel; FM6 LFO; CZ-1 vibrato), then the track LFO pages.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "226-242",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L226-L242"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "516-568",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L516-L568"
    }
   ]
  },
  {
   "id": "scales",
   "name": "SCALES",
   "how_to_get_there": "Press SCL (printed SEL); it is the first scale page, and SCL reopens the last one used. Or OCT+ on the SCL list's Scale row.",
   "what_it_is": "The scale browser: 70 scales by family, with names and note counts, plus root and key mode.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "520",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L520"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_list.c",
     "lines": "159-182",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L159-L182"
    }
   ]
  },
  {
   "id": "scl",
   "name": "SCL list",
   "how_to_get_there": "Press SCL again from SCALES.",
   "what_it_is": "A list page, one row per setting: root, scale, key mode (QNT), MPC degree (only with QNT MPC), transpose, favourite.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "521",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L521"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_list.c",
     "lines": "14-25",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L14-L25"
    }
   ]
  },
  {
   "id": "chord",
   "name": "CHORD",
   "how_to_get_there": "Press SCL once more after the SCL list.",
   "what_it_is": "One-finger chords: which chord (off, triads or seventh chords built from the scale, or one fixed chord shape) and its voicing.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "522",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L522"
    }
   ]
  },
  {
   "id": "edit",
   "name": "Sound pages (EDIT)",
   "how_to_get_there": "Press EDIT; PRESETS jumps between sections, SELECT turns pages.",
   "what_it_is": "The selected track’s engine settings, grouped into sections. The header names the page and uses dots for pages in its section; PRESETS moves between sections.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_sections.c",
     "lines": "45-84",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_sections.c#L45-L84"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_sections.c",
     "lines": "129-133",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_sections.c#L129-L133"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_draw.c",
     "lines": "150-209",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L150-L209"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_pages.c",
     "lines": "887-908",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_pages.c#L887-L908"
    }
   ]
  },
  {
   "id": "edit_map",
   "name": "Section map",
   "how_to_get_there": "Press EDIT while on a sound page (engines with several sections).",
   "what_it_is": "A list of sound sections; the selected section opens to show its pages as pills. Each section remembers its last page.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_sections.c",
     "lines": "221-275",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_sections.c#L221-L275"
    }
   ]
  },
  {
   "id": "voice_lists",
   "name": "List pages (VOICE, FM6 LFO and controls)",
   "how_to_get_there": "In EDIT, the Voice section; on FM6 also its LFO and Ctrl sections.",
   "what_it_is": "Settings shown as rows: VOICE gathers voice mode, glide, priority, allocation, detune, pan, mute and spread.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_list.c",
     "lines": "14-25",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L14-L25"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_list.c",
     "lines": "3-10",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L3-L10"
    }
   ]
  },
  {
   "id": "store",
   "name": "P5 STORE / FM6 STORE",
   "how_to_get_there": "In EDIT, the Store section (PROPHET or FM6 tracks).",
   "what_it_is": "PROPHET and FM6 save to the same U001-U384 user library as every other engine; the Store page lists those shared slots.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/core.h",
     "lines": "66",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/core.h#L66"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/shared_presets.c",
     "lines": "31-46",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/shared_presets.c#L31-L46"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "16-32",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L16-L32"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/upreset.c",
     "lines": "485-492",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/upreset.c#L485-L492"
    }
   ]
  },
  {
   "id": "cz_tools",
   "name": "CZ TOOLS",
   "how_to_get_there": "In EDIT on a CZ-1 track, the Tools section.",
   "what_it_is": "Actions for the CZ-1 tone: name it, copy line 1 to 2 or 2 to 1, compare with the unedited tone.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "564",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L564"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1165-1179",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1165-L1179"
    }
   ]
  },
  {
   "id": "drum_sound",
   "name": "DRUM SOUND / DRUM MIX",
   "how_to_get_there": "In EDIT on a DRUM track.",
   "what_it_is": "One kit drum at a time: tuning, decay and the drum’s character setting; DRUM MIX changes its level.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "527-528",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L527-L528"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_draw.c",
     "lines": "621-627",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L621-L627"
    }
   ]
  },
  {
   "id": "mixer",
   "name": "MIXER",
   "how_to_get_there": "Press GLO (from any other page).",
   "what_it_is": "Level, pan and mute of the selected track (ALGORITHM picks the track).",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "570-585",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L570-L585"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "602",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L602"
    }
   ]
  },
  {
   "id": "global",
   "name": "GLOBAL",
   "how_to_get_there": "Press GLO again from MIXER.",
   "what_it_is": "Device-wide A4 reference pitch, polyphony budget, clock source and fine tune.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "570-585",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L570-L585"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "591-592",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L591-L592"
    }
   ]
  },
  {
   "id": "system",
   "name": "SYSTEM",
   "how_to_get_there": "Press GLO again from GLOBAL (once more returns to MIXER).",
   "what_it_is": "MIDI input status, drum MIDI channel, MIDI channel routing, CPU load.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "570-585",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L570-L585"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "591-592",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L591-L592"
    }
   ]
  },
  {
   "id": "user",
   "name": "USER (save or load a sound)",
   "how_to_get_there": "Press SAVE.",
   "what_it_is": "The shared U001-U384 user library; any engine can occupy a slot. SAVE opens the chosen slot’s sheet at Save here.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/core.h",
     "lines": "66",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/core.h#L66"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "16-32",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L16-L32"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/upreset.c",
     "lines": "485-492",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/upreset.c#L485-L492"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "554-568",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L554-L568"
    }
   ]
  },
  {
   "id": "project",
   "name": "PROJECT",
   "how_to_get_there": "Press SAVE twice.",
   "what_it_is": "Projects A-D, the template (T) and New song as a list.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "516-568",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L516-L568"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "595",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L595"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "3-6",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L3-L6"
    }
   ]
  },
  {
   "id": "browser",
   "name": "Sound browser (SAVE > PRESETS)",
   "how_to_get_there": "Press SAVE three times.",
   "what_it_is": "A sound list with the selected sound in a larger card, neighbours above and below, and its list name and position at the top.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "516-568",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L516-L568"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "593",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L593"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_browser.c",
     "lines": "35-65",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_browser.c#L35-L65"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_browser.c",
     "lines": "68-118",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_browser.c#L68-L118"
    }
   ]
  },
  {
   "id": "arp",
   "name": "ARP and ARP 2",
   "how_to_get_there": "Press ARP; again for ARP 2.",
   "what_it_is": "Arpeggiator mode, rate, octaves, gate; then swing, probability, hold, order.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "596-597",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L596-L597"
    }
   ]
  },
  {
   "id": "notes",
   "name": "NOTES (synth track)",
   "how_to_get_there": "Press SEQ (on a non-DRUM track).",
   "what_it_is": "The piano roll of the selected track's pattern: entered steps and recorded takes, edited note by note.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "598",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L598"
    },
    {
     "kind": "doc",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L617-L620",
     "path": "README.md",
     "lines": "617-620",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
    }
   ]
  },
  {
   "id": "drum_grid",
   "name": "Drum grid (NOTES on a DRUM track)",
   "how_to_get_there": "Press SEQ on a DRUM track (a pattern with recorded hits shows the piano roll until you record again).",
   "what_it_is": "Eight lanes by 16 steps: the white keys are the steps of the page shown, the black keys pick the lane.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "391",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L391"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "770-798",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
    }
   ]
  },
  {
   "id": "pattern",
   "name": "PATTERN",
   "how_to_get_there": "Press SEQ again from NOTES.",
   "what_it_is": "Pattern length, step division, swing, gate.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "599",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L599"
    }
   ]
  },
  {
   "id": "tempo",
   "name": "TEMPO",
   "how_to_get_there": "Press SEQ again from PATTERN.",
   "what_it_is": "The project's tempo and swing, and the selected track's recording quantize (QNT).",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "600-601",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L600-L601"
    }
   ]
  },
  {
   "id": "patterns",
   "name": "PATTERNS",
   "how_to_get_there": "Hold SEQ about 0.7 s, or press SEQ until it shows.",
   "what_it_is": "All four tracks' eight patterns at once (playing, queued, used, empty) with the song's sections under them.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_patterns.c",
     "lines": "3-19",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_patterns.c#L3-L19"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "2217-2222",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2217-L2222"
    }
   ]
  },
  {
   "id": "song",
   "name": "SONG",
   "how_to_get_there": "From PATTERNS, turn SELECT or press SEQ.",
   "what_it_is": "The arrangement: up to 16 sections, each a pattern per track and a repeat count, plus the jam log.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_patterns.c",
     "lines": "3-19",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_patterns.c#L3-L19"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "604",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L604"
    }
   ]
  },
  {
   "id": "motion",
   "name": "MOTION",
   "how_to_get_there": "SEQ pages, shown only once the selected pattern holds recorded knob motion.",
   "what_it_is": "Recorded knob moves as lanes; select a lane, then a step and its value. You can insert a point, clear a point, or clear a lane.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_motion.c",
     "lines": "166-220",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_motion.c#L166-L220"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_motion.c",
     "lines": "260-319",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_motion.c#L260-L319"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "254-276",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L254-L276"
    }
   ]
  },
  {
   "id": "drum_hit",
   "name": "DRUM HIT",
   "how_to_get_there": "SEQ pages, DRUM tracks only (the last one).",
   "what_it_is": "Edit single drum hits: walk the hits, pick the drum, change one hit's pitch and length.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "606",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L606"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "826-831",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L826-L831"
    }
   ]
  },
  {
   "id": "seq_held",
   "name": "SEQ held",
   "how_to_get_there": "Hold SEQ (the keys work at once; the PATTERNS page opens after about 0.7 s).",
   "what_it_is": "Eight white keys select patterns, four black keys select tracks in use. An empty pattern arms one pass only when this track is unarmed; a continuous REC arm already in place stays continuous. Double-tapping a used pattern toggles recording. Hold a pattern key for 1 s to open its copy/delete dialog.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "107-119",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L107-L119"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "263-347",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L347"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "265-281",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq.c",
     "lines": "1033-1040",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
    }
   ]
  },
  {
   "id": "layer_glo",
   "name": "GLO layer",
   "how_to_get_there": "Hold GLO past the hold time (0.4 s by default), or press a key or knob while holding it. Double-press to keep it open.",
   "what_it_is": "Mixing shortcuts for the tracks in use: solo and mute keys, unmute all, tap tempo, and track levels on the four knobs.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_layer.c",
     "lines": "12-20",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_layer.c",
     "lines": "27-35",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L27-L35"
    }
   ]
  },
  {
   "id": "layer_scl",
   "name": "SCL layer",
   "how_to_get_there": "Hold SCL (printed SEL) past the hold time; double-press to keep it open.",
   "what_it_is": "Key shortcuts: a key sets the root; the knobs set root, scale, chord and voicing.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_layer.c",
     "lines": "12-20",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_layer.c",
     "lines": "27-35",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L27-L35"
    }
   ]
  },
  {
   "id": "sheet",
   "name": "Action sheet or value list",
   "how_to_get_there": "Hold OCT+ about 0.7 s on a page with a sheet, or press OCT+ on an item (slot, note, motion lane, list row).",
   "what_it_is": "A card of things to do with the page or the item; or the full list of a value's names.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "3-10",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L3-L10"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "273-290",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L273-L290"
    }
   ]
  },
  {
   "id": "dialog",
   "name": "Question",
   "how_to_get_there": "Appears before some destructive actions: overwriting or erasing a project or sound slot; clearing a pattern, track, song, motion or shared FX; removing a track; deleting a pattern or song row; replacing a used pattern; Init sound from Stage or a sound sheet; a new song with unsaved changes; replacing a song with a jam; or replacing protected old settings/templates. Some writes never ask: see overwrites_without_asking. Init sound on a PROPHET or FM6 Store sheet runs immediately; only the PROPHET path takes an undo snapshot.",
   "what_it_is": "A yes/no question: OCT+ confirms and OCT- cancels. The SEQ pattern dialog also accepts its eight pattern keys.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_draw.c",
     "lines": "857-962",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L857-L962"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "2170-2183",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2170-L2183"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "1258-1263",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L1258-L1263"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "77-99",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L77-L99"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "114-115",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L114-L115"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "80-98",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L80-L98"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1153-1163",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1153-L1163"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1192-1203",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1192-L1203"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/fm6_store.c",
     "lines": "148-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/fm6_store.c#L148-L156"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/eng_fm6.c",
     "lines": "201-214",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L201-L214"
    }
   ]
  },
  {
   "id": "name",
   "name": "NAME",
   "how_to_get_there": "Saving or renaming a user preset or project (also CZ TOOLS > NAME).",
   "what_it_is": "Name a project or sound with the keys and knobs: up to 12 characters normally, 20 for PROPHET native sounds, 10 for FM6 and 16 for CZ-1.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_name.c",
     "lines": "24-27",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L24-L27"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_name.c",
     "lines": "47-52",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L47-L52"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/prophet_patch.c",
     "lines": "23",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/prophet_patch.c#L23"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/cz_edit.h",
     "lines": "12",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/cz_edit.h#L12"
    }
   ]
  },
  {
   "id": "new_song",
   "name": "NEW SONG",
   "how_to_get_there": "SAVE > PROJECT, move past T to New song, press OCT+.",
   "what_it_is": "Choose key and tempo, then track roles. A role of -- omits that track; remaining tracks keep their order, with at least one track. The template supplies the starting sounds.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_new.c",
     "lines": "3-14",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_new.c#L3-L14"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_new.c",
     "lines": "28-39",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_new.c#L28-L39"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_new.c",
     "lines": "60-110",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_new.c#L60-L110"
    }
   ]
  },
  {
   "id": "designer",
   "name": "Sound designer",
   "how_to_get_there": "Settings menu > SOUND DESIGNER, or the sound sheet's Sound designer row.",
   "what_it_is": "A guided route through a sound: start screen, then stages (features, source, tone, envelope, motion, play, effects).",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_designer_input.c",
     "lines": "3-7",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L3-L7"
    },
    {
     "kind": "doc",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/SOUND_DESIGNER.md#L3",
     "path": "docs/SOUND_DESIGNER.md",
     "lines": "3",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
    }
   ]
  },
  {
   "id": "calibration",
   "name": "HARDWARE CALIBRATION",
   "how_to_get_there": "Hold OCT- and OCT+ while switching on, or Settings menu > CALIBRATION.",
   "what_it_is": "Asks you to press each button and turn each knob right, so Melodee learns the panel. 30 s idle cancels.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/main.c",
     "lines": "230-233",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/main.c#L230-L233"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "2494-2553",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2494-L2553"
    }
   ]
  },
  {
   "id": "update_countdown",
   "name": "Update mode countdown",
   "how_to_get_there": "Hold OCT- and OCT+ together.",
   "what_it_is": "After 2 s a countdown covers the screen; at 5 s the FM-1 restarts in update mode (UBOOT). Letting go cancels.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/main.c",
     "lines": "268-294",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/main.c#L268-L294"
    }
   ]
  },
  {
   "id": "screen_off",
   "name": "Screen asleep",
   "how_to_get_there": "After the Settings menu's SCREEN OFF time with nothing touched.",
   "what_it_is": "The screen is dark; the first touch of anything only wakes it.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/screen.c",
     "lines": "49-70",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/screen.c#L49-L70"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/screen.c",
     "lines": "18",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/screen.c#L18"
    }
   ]
  },
  {
   "id": "crash",
   "name": "MELODEE CRASH",
   "how_to_get_there": "Only after a firmware fault.",
   "what_it_is": "A red screen with fault registers for about 4 s, then a restart.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/main.c",
     "lines": "114-139",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/main.c#L114-L139"
    }
   ]
  },
  {
   "id": "fx_rack",
   "name": "FX rack",
   "how_to_get_there": "Press FX; from an occupied slot page, OCT- returns here.",
   "what_it_is": "The selected track’s three insert effects and its Shared send, one row each. KNOB 2 picks the row, KNOB 1 its effect, and KNOB 4 its amount.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "503-513",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L503-L513"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_pages.c",
     "lines": "126-131",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_pages.c#L126-L131"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1738-1769",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1738-L1769"
    }
   ]
  },
  {
   "id": "shared_fx",
   "name": "SHARED rack",
   "how_to_get_there": "On FX, select Shared with KNOB 2 and press OCT+, or turn SELECT past the track slots.",
   "what_it_is": "Three shared effect slots A-C and their return level. KNOB 3 selects CHAIN or SPLIT; SPLIT exposes each selected track’s separate send amount.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "503-513",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L503-L513"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_pages.c",
     "lines": "126-131",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_pages.c#L126-L131"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1738-1769",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1738-L1769"
    }
   ]
  },
  {
   "id": "chord_view",
   "name": "HOME chord view",
   "how_to_get_there": "Tap HOME while Stage is showing; tap again to return.",
   "what_it_is": "A circle of fifths marks the key and sounding pitches, with their chord in the middle. Track colours identify the notes, a four-octave keyboard sits below, and drum tracks pulse without adding pitches.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "2223-2228",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2223-L2228"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_view.c",
     "lines": "3-11",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_view.c#L3-L11"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_view.c",
     "lines": "43-74",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_view.c#L43-L74"
    }
   ]
  },
  {
   "id": "pattern_key_dialog",
   "name": "Pattern copy/delete",
   "how_to_get_there": "Hold SEQ and one of its first eight white pattern keys for 1 s.",
   "what_it_is": "Press that pattern’s key again or OCT+ to delete it; another of the eight keys copies it there. OCT- cancels. Playing patterns and used copy destinations wait for the track’s loop boundary.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "107-119",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L107-L119"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "253-347",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L253-L347"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1953-1958",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1953-L1958"
    }
   ]
  },
  {
   "id": "boot_maintenance",
   "name": "Startup maintenance",
   "how_to_get_there": "Appears when startup migration, repair or a preset wipe runs.",
   "what_it_is": "Shows progress before flash writes; leave power connected. A failure stays visible until acknowledged. For preset maintenance, OCT- offers a complete preset wipe and OCT+ keeps/continues; the wipe needs a second OCT+ confirmation.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_boot.c",
     "lines": "29-97",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_boot.c#L29-L97"
    }
   ]
  },
  {
   "id": "sid_chip",
   "name": "CHIP (SID)",
   "how_to_get_there": "Press EDIT on a SID track and choose CHIP.",
   "what_it_is": "MODEL selects 6581, 8580, C64 6581 or C64 8580; the other knobs set waveform, stack and pulse width.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/eng_sid.c",
     "lines": "47",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L47"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/eng_sid.c",
     "lines": "543-554",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L543-L554"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "525-526",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L525-L526"
    }
   ]
  },
  {
   "id": "drum_kit",
   "name": "KIT (DRUM)",
   "how_to_get_there": "Press EDIT on a DRUM track and choose KIT.",
   "what_it_is": "Select an 808, 909 or SID kit, then adjust the kit’s tuning, tone and decay.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/eng_drum.c",
     "lines": "148",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L148"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/eng_drum.c",
     "lines": "464-475",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L464-L475"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "525-526",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L525-L526"
    }
   ]
  },
  {
   "id": "drum_hit_macros",
   "name": "HIT (DRUM sound macros)",
   "how_to_get_there": "On a DRUM track, use EDIT and SELECT to reach HIT.",
   "what_it_is": "Kit-wide snap and accent; on SID kits the last two controls become DIGI (kick and snare digital playback) and filter resonance, replacing kick mode and drive.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/eng_drum.c",
     "lines": "454-475",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L454-L475"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "525-526",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L525-L526"
    }
   ]
  },
  {
   "id": "shared_fx_sheet",
   "name": "Shared FX sheet",
   "how_to_get_there": "Hold OCT+ for about 0.7 s on SHARED or a SEND FX slot page; on the SHARED RETURN row, a tap of OCT+ also opens it.",
   "what_it_is": "Two rows: Routing chooses CHAIN or SPLIT; Clear shared FX asks before returning all three shared slots to their defaults, with their effects off and TONE at FULL.",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1567-1584",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1567-L1584"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1993-2000",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1993-L2000"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "273-290",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L273-L290"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "321-323",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L321-L323"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "159-164",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L159-L164"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "163-164",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L163-L164"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "342-347",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L342-L347"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_draw.c",
     "lines": "912-915",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L912-L915"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1917-1922",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1917-L1922"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "249-266",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L249-L266"
    }
   ]
  }
 ],
 "controls": {
  "button_home": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Returns to the last HOME view from a page; already on HOME, switches between Stage and the chord view. Acts on release. Questions, NAME, the menu and action sheets take priority.",
    "short_label": "HOME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2170-2183",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2170-L2183"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2223-2228",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2223-L2228"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Held about 0.7 s: opens the Settings menu; held again, closes it.",
    "short_label": "MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1567-1584",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1567-L1584"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2098-2111",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2098-L2111"
     }
    ]
   },
   {
    "mode": "new_song",
    "gesture": "press",
    "action": "Cancels NEW SONG without creating anything.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_new.c",
      "lines": "115-140",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_new.c#L115-L140"
     }
    ]
   },
   {
    "mode": "designer",
    "gesture": "press",
    "action": "Opens the designer's closing sheet (on the start screen it closes the designer).",
    "short_label": "FINISH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "59-61",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L59-L61"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "53-54",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L53-L54"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/SOUND_DESIGNER.md#L34",
      "path": "docs/SOUND_DESIGNER.md",
      "lines": "34",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Ignored while GLO or SCL is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2064-2075",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2064-L2075"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "27-35",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L27-L35"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens SAVE's pages: USER first (save or load a sound), then each press goes on to PROJECT, the PRESETS browser, and back to USER. Acts when you let go.",
    "short_label": "SAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2150-2154",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2150-L2154"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "534-567",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L534-L567"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "593-595",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L593-L595"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Held about 0.7 s: saves the project back to its slot, stopping playback first. A project without a slot opens PROJECT on a free slot. It overwrites without asking and has no undo.",
    "short_label": "QUICK SAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "562-581",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L562-L581"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2150-2154",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2150-L2154"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/project.c",
      "lines": "585-609",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L585-L609"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_with:button_rec",
    "action": "SAVE and REC together: writes the project over its slot at once, with no question and no undo, stopping playback first. A project with no slot opens SAVE > PROJECT on a free slot.",
    "short_label": "QUICK SAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "562-582",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L562-L582"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/project.c",
      "lines": "585-609",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L585-L609"
     }
    ]
   },
   {
    "mode": "designer",
    "gesture": "press",
    "action": "Plays the original sound for comparison; press again to return to the design.",
    "short_label": "COMPARE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "58-73",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L58-L73"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/SOUND_DESIGNER.md#L33",
      "path": "docs/SOUND_DESIGNER.md",
      "lines": "33",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Does nothing on the NAME screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2133-2142",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2133-L2142"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Tap to change whether this track is ready to record; playback keeps its current state. While playing, recording begins at the next pattern start and continues over later loops until disarmed or stopped. STOP keeps its arm enabled. With playback stopped and the track armed, the first played note starts a take.",
    "short_label": "REC ARM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "508-530",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L508-L530"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "1033-1043",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1043"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "920-945",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L920-L945"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "511-533",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L511-L533"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "1134-1141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1134-L1141"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "On SONG an unarmed track is not armed; the screen points you to SEQ.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "508-530",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L508-L530"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Held about 0.7 s: Capture. The selected track's recent playing goes into its pattern with the played timing, velocity and length. Hold EDIT to undo.",
    "short_label": "CAPTURE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "584-596",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L584-L596"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2155-2165",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2155-L2165"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "long_press",
    "action": "Held on SONG: turns the jam log (the pattern changes since PLAY) into the song's sections; asks first if a song exists.",
    "short_label": "TAKE JAM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2112-2123",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2112-L2123"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "139-149",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L139-L149"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Does nothing in the menu, a question or NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2112-2123",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2112-L2123"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Starts or stops the tracks in use.",
    "short_label": "PLAY/STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "920-945",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L920-L945"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2249-2262",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2249-L2262"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "On SONG, while stopped: plays the arrangement; while playing: stops.",
    "short_label": "PLAY SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2249-2262",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2249-L2262"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1181-1183",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1181-L1183"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_rec",
    "action": "REC held, then PLAY: arms the selected track and starts recording. Already playing: recording waits for its next pattern start. Recording continues across loops until disarmed or stopped.",
    "short_label": "REC+PLAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "533-559",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L533-L559"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "1033-1043",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1043"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "With GLO's layer open: restarts from the top without stopping (stopped: starts). Refused when the clock is external.",
    "short_label": "RESTART",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "289-299",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L289-L299"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2249-2262",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2249-L2262"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "On NAME it only stops a running transport, so the name can be saved; it never starts one.",
    "short_label": "STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2133-2142",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2133-L2142"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "press",
    "action": "Ignored while a question, the menu, an action sheet or the section map is open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2170-2183",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2170-L2183"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2184-2204",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2184-L2204"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2205-2214",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2205-L2214"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2125-2131",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2125-L2131"
     }
    ]
   },
   {
    "mode": "designer",
    "gesture": "press",
    "action": "Starts or stops the pattern; nothing plays by itself while designing.",
    "short_label": "PLAY/STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "36",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L36"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/SOUND_DESIGNER.md#L48",
      "path": "docs/SOUND_DESIGNER.md",
      "lines": "48",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "stage",
    "gesture": "press",
    "action": "Octave down, to -3. Acts as you press.",
    "short_label": "OCT-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2291-2299",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2291-L2299"
     }
    ]
   },
   {
    "mode": "stage",
    "gesture": "press_with:button_oct_up",
    "action": "Both octave buttons together: octave back to 0.",
    "short_label": "OCT 0",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2291-2299",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2291-L2299"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Off HOME: Back. Closes the innermost picker, action, selection, Copy to or SCALES first. FX slots go back to their rack; otherwise returns to HOME.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2343-2362",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2343-L2362"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1757-1770",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1757-L1770"
     }
    ]
   },
   {
    "mode": "browser",
    "gesture": "press",
    "action": "Revert: goes back to the sound you had before browsing, then to Stage.",
    "short_label": "REVERT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2284-2288",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2284-L2288"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_browser.c",
      "lines": "134-146",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_browser.c#L134-L146"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "release",
    "action": "Clears queued pattern changes first; with none queued, returns to Stage.",
    "short_label": "CLR QUEUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2352-2358",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2352-L2358"
     }
    ]
   },
   {
    "mode": "scales",
    "gesture": "release",
    "action": "Back to the SCL list.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2343-2349",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2343-L2349"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "release",
    "action": "No: closes the question, nothing changes.",
    "short_label": "NO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2170-2183",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2170-L2183"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "release",
    "action": "Leaves About, or closes the menu.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_menu.c",
      "lines": "337-343",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_menu.c#L337-L343"
     }
    ]
   },
   {
    "mode": "sheet",
    "gesture": "release",
    "action": "Closes the sheet or value list.",
    "short_label": "CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "352-370",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "449-470",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L449-L470"
     }
    ]
   },
   {
    "mode": "edit_map",
    "gesture": "release",
    "action": "Closes the section map.",
    "short_label": "CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_sections.c",
      "lines": "221-250",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_sections.c#L221-L250"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "release",
    "action": "Cancels: nothing is written.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "266-300",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L266-L300"
     }
    ]
   },
   {
    "mode": "new_song",
    "gesture": "release",
    "action": "Back to the key screen, or cancels NEW SONG.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_new.c",
      "lines": "115-140",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_new.c#L115-L140"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "action": "Puts back what the layer changed since it opened (mutes, levels and tempo). No octave change.",
    "short_label": "PUT BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "302-326",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L302-L326"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "release",
    "action": "Puts back what the layer changed since it opened (root, scale, chord and voicing). No octave change.",
    "short_label": "PUT BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "302-326",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L302-L326"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "action": "EDIT held, then OCT-: undo. On NOTES and DRUM HIT, note edits take priority, then the recorded take. Elsewhere, undo the recorded take or last load.",
    "short_label": "UNDO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2024-2038",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2024-L2038"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2155-2165",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2155-L2165"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq_undo.c",
      "lines": "132-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq_undo.c#L132-L141"
     }
    ]
   },
   {
    "mode": "designer",
    "gesture": "release",
    "action": "Previous stage; before the first, the designer's closing sheet. On the start screen: close without changes.",
    "short_label": "PREV STAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "58-73",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L58-L73"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "53-54",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L53-L54"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/SOUND_DESIGNER.md#L23-L34",
      "path": "docs/SOUND_DESIGNER.md",
      "lines": "23-34",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "update_countdown",
    "gesture": "press_with:button_oct_up",
    "action": "OCT- and OCT+ held 5 s: the FM-1 restarts in update mode (UBOOT) with a countdown from 2 s; letting go cancels.",
    "short_label": "UPDATE MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/main.c",
      "lines": "268-295",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/main.c#L268-L295"
     }
    ]
   },
   {
    "mode": "fx_rack",
    "gesture": "release",
    "action": "Returns to HOME.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1757-1770",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1757-L1770"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2343-2361",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2343-L2361"
     }
    ]
   },
   {
    "mode": "fx_insert",
    "gesture": "release",
    "action": "Returns to the track's FX rack, with this slot selected.",
    "short_label": "FX RACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1757-1770",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1757-L1770"
     }
    ]
   },
   {
    "mode": "send_fx",
    "gesture": "release",
    "action": "Returns to SHARED, with this slot selected.",
    "short_label": "SHARED RACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1757-1770",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1757-L1770"
     }
    ]
   },
   {
    "mode": "shared_fx",
    "gesture": "release",
    "action": "Returns to the FX rack's Shared row.",
    "short_label": "TRACK RACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1757-1770",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1757-L1770"
     }
    ]
   },
   {
    "mode": "pattern_key_dialog",
    "gesture": "release",
    "action": "Closes the pattern-key question and leaves the pattern as it was.",
    "short_label": "KEEP PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2170-2183",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2170-L2183"
     }
    ]
   },
   {
    "mode": "boot_maintenance",
    "gesture": "press",
    "action": "After a failed preset migration, offers to wipe every user preset. On the wipe question, goes back.",
    "short_label": "WIPE OFFER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_boot.c",
      "lines": "86-97",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_boot.c#L86-L97"
     }
    ]
   },
   {
    "mode": "chord_view",
    "gesture": "press",
    "action": "Octave down, to -3. Acts as you press.",
    "short_label": "OCT-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_view.c",
      "lines": "3-11",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_view.c#L3-L11"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2291-2299",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2291-L2299"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "stage",
    "gesture": "release",
    "action": "Octave up, to +3. Acts when you let go.",
    "short_label": "OCT+",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2291-2299",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2291-L2299"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1997-2005",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1997-L2005"
     }
    ]
   },
   {
    "mode": "stage",
    "gesture": "long_press",
    "action": "Held about 0.7 s on HOME: opens the sound sheet, including Add track and Remove track. Up to four tracks; removal asks first and requires stopped playback.",
    "short_label": "SOUND SHEET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "97-100",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L97-L100"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "273-301",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L273-L301"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "329-338",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L329-L338"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "action": "Off HOME: Enter. Opens the chosen row, slot, note, motion lane or FX rack slot, or the page's action sheet. An empty FX slot opens its type list.",
    "short_label": "ENTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2328-2342",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2328-L2342"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1738-1755",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1738-L1755"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Held about 0.7 s on a sound, ENV, LFO or FX page, NOTES, PATTERN, PATTERNS or SONG: that page's sheet.",
    "short_label": "PAGE SHEET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1997-2005",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1997-L2005"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "273-291",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L273-L291"
     }
    ]
   },
   {
    "mode": "browser",
    "gesture": "press",
    "action": "Keep: the sound shown stays loaded (a pending fast turn loads now); back to Stage.",
    "short_label": "KEEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2284-2288",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2284-L2288"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_browser.c",
      "lines": "134-146",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_browser.c#L134-L146"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "release",
    "action": "On the Scale row opens SCALES; on a named setting opens its full list.",
    "short_label": "OPEN LIST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2317-2320",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2317-L2320"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_list.c",
      "lines": "159-182",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L159-L182"
     }
    ]
   },
   {
    "mode": "scales",
    "gesture": "release",
    "action": "Done: back to the SCL list with the scale chosen.",
    "short_label": "DONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2335-2336",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2335-L2336"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "release",
    "action": "Empty cursor: places the last note played. On a note: its sheet (length, velocity, chance, slide, move, copy, delete).",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "237-269",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L237-L269"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "226-229",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L226-L229"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "release",
    "action": "Sets the lane's hit at the cursor; on a hit, opens its sheet (accent, chance, clear).",
    "short_label": "HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "237-269",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L237-L269"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "234-235",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L234-L235"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "long_press",
    "action": "Held on NOTES without a selection: the pattern sheet (Quantize to 1, 0.5 or 0.25 step, Clear pattern, Clear motion).",
    "short_label": "PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2006-2008",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2006-L2008"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "158",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L158"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "release",
    "action": "Plays the song from its first section, or stops it.",
    "short_label": "PLAY/STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1181-1183",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1181-L1183"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "1096-1111",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L1096-L1111"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "long_press",
    "action": "Song sheet: insert, duplicate or delete a section, take the jam, clear the song.",
    "short_label": "SONG SHEET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1997-2005",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1997-L2005"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "150-152",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L150-L152"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "release",
    "action": "Selected track's pattern sheet (Copy to, Delete pattern); during Copy to it copies there.",
    "short_label": "PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2328-2342",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2328-L2342"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "166",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L166"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_patterns.c",
      "lines": "305-325",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_patterns.c#L305-L325"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "release",
    "action": "Opens the slot's sheet: Load, Save here, Rename, Send, Erase. Reached by SAVE, it opens on Save here.",
    "short_label": "SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "117-152",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L117-L152"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "107-115",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L107-L115"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "153-158",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L153-L158"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "release",
    "action": "Opens the slot's sheet: Load, Save here, Rename, Boot (load at power-on), Erase. T: Load or Save as template. New song: starts NEW SONG.",
    "short_label": "SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "117-152",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L117-L152"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "107-115",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L107-L115"
     }
    ]
   },
   {
    "mode": "store",
    "gesture": "release",
    "action": "Opens the slot's sheet: Save here, Send, Init sound.",
    "short_label": "SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "117-152",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L117-L152"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "107-115",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L107-L115"
     }
    ]
   },
   {
    "mode": "cz_tools",
    "gesture": "release",
    "action": "Does the action picked with a knob (NAME, LINE 1>2, LINE 2>1, COMPARE).",
    "short_label": "DO IT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1165-1179",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1165-L1179"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1050-1053",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1050-L1053"
     }
    ]
   },
   {
    "mode": "motion",
    "gesture": "release",
    "action": "Opens the lane's sheet: Play, Clear this lane, Clear all motion.",
    "short_label": "LANE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_motion.c",
      "lines": "149-165",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_motion.c#L149-L165"
     }
    ]
   },
   {
    "mode": "edit_map",
    "gesture": "release",
    "action": "Opens the page under the map's cursor.",
    "short_label": "OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_sections.c",
      "lines": "221-250",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_sections.c#L221-L250"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "release",
    "action": "Yes: does it.",
    "short_label": "YES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2170-2183",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2170-L2183"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "release",
    "action": "On a setting: steps its value. On ABOUT, CALIBRATION or SOUND DESIGNER: opens it. On BACK: closes the menu.",
    "short_label": "OK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_menu.c",
      "lines": "427-450",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_menu.c#L427-L450"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_menu.c",
      "lines": "351-425",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_menu.c#L351-L425"
     }
    ]
   },
   {
    "mode": "sheet",
    "gesture": "release",
    "action": "Runs the selected row. Delete note, Clear hit, Clear lane, Load and saving a readable template act immediately. Clear pattern and Init sound from Stage or a sound sheet ask first. Init sound on the PROPHET or FM6 Store sheet resets the current sound immediately: hold EDIT to undo PROPHET; FM6 takes no undo snapshot. With autosave on, the reset can reach the current project slot after 5 seconds stopped and idle.",
    "short_label": "DO IT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "220-235",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L220-L235"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_motion.c",
      "lines": "136-147",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_motion.c#L136-L147"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "352-370",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "81-83",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L81-L83"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "154-158",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L154-L158"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "107-109",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L107-L109"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/project.c",
      "lines": "938-942",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L938-L942"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "77-99",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L77-L99"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "114-115",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L114-L115"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "80-98",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L80-L98"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1153-1163",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1153-L1163"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1192-1203",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1192-L1203"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/fm6_store.c",
      "lines": "148-156",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/fm6_store.c#L148-L156"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "201-214",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L201-L214"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "703-727",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/project.c",
      "lines": "610-624",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L624"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "release",
    "action": "Saves the name (writes the preset or project).",
    "short_label": "SAVE NAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "266-300",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L266-L300"
     }
    ]
   },
   {
    "mode": "new_song",
    "gesture": "release",
    "action": "Next screen; on the roles screen, creates the song.",
    "short_label": "NEXT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_new.c",
      "lines": "115-140",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_new.c#L115-L140"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "action": "Does nothing in the GLO or SCL layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "302-326",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L302-L326"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "action": "EDIT held, then OCT+: redo. On NOTES and DRUM HIT, redo note edits or the recorded take; elsewhere redo the recorded take or load.",
    "short_label": "REDO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2024-2038",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2024-L2038"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2155-2165",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2155-L2165"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq_undo.c",
      "lines": "132-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq_undo.c#L132-L141"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_lfo",
    "action": "LFO held, then OCT+: keeps the temporary knob changes (KEPT).",
    "short_label": "KEEP TWEAK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1980-1982",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1980-L1982"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RECORDING_PERFORMANCE.md#L74-L80",
      "path": "docs/RECORDING_PERFORMANCE.md",
      "lines": "74-80",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "designer",
    "gesture": "release",
    "action": "Next stage; past the last, the designer's closing sheet. On the start screen: start designing.",
    "short_label": "NEXT STAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "58-73",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L58-L73"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "53-54",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L53-L54"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/SOUND_DESIGNER.md#L23-L34",
      "path": "docs/SOUND_DESIGNER.md",
      "lines": "23-34",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "fx_rack",
    "gesture": "release",
    "action": "Opens the selected slot. Empty slot: opens the effect list. Shared row: opens SHARED.",
    "short_label": "OPEN SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1738-1755",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1738-L1755"
     }
    ]
   },
   {
    "mode": "shared_fx",
    "gesture": "release",
    "action": "Opens the selected shared slot (empty: effect list). RETURN opens the shared-effects sheet.",
    "short_label": "OPEN SHARED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1738-1755",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1738-L1755"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "288-290",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L288-L290"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "321-323",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L321-L323"
     }
    ]
   },
   {
    "mode": "pattern_key_dialog",
    "gesture": "release",
    "action": "Deletes the held pattern, as pressing its white key again does. During playback, deletion waits for its loop end.",
    "short_label": "DELETE PAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "306-348",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L306-L348"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1953-1961",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1953-L1961"
     }
    ]
   },
   {
    "mode": "boot_maintenance",
    "gesture": "press",
    "action": "After a maintenance failure, acknowledges and continues. A failed preset migration keeps existing presets protected; on its wipe question, confirms wiping all user presets.",
    "short_label": "CONTINUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_boot.c",
      "lines": "86-97",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_boot.c#L86-L97"
     }
    ]
   },
   {
    "mode": "chord_view",
    "gesture": "release",
    "action": "Octave up, to +3. Acts when you let go.",
    "short_label": "OCT+",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_view.c",
      "lines": "3-11",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_view.c#L3-L11"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2291-2299",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2291-L2299"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1997-2005",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1997-L2005"
     }
    ]
   },
   {
    "mode": "chord_view",
    "gesture": "long_press",
    "action": "Held about 0.7 s on HOME: opens the sound sheet, including Add track and Remove track. Up to four tracks; removal asks first and requires stopped playback.",
    "short_label": "SOUND SHEET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_view.c",
      "lines": "3-11",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_view.c#L3-L11"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "97-100",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L97-L100"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "273-301",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L273-L301"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "329-338",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L329-L338"
     }
    ]
   },
   {
    "mode": "shared_fx",
    "gesture": "long_press",
    "action": "Held about 0.7 s: opens the Shared FX sheet with Routing and Clear shared FX; clearing asks for confirmation.",
    "short_label": "BUS SHEET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1567-1584",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1567-L1584"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1993-2000",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1993-L2000"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "273-290",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L273-L290"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "321-323",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L321-L323"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "159-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L159-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "352-370",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
     }
    ]
   },
   {
    "mode": "send_fx",
    "gesture": "long_press",
    "action": "Held about 0.7 s: opens the Shared FX sheet with Routing and Clear shared FX; clearing asks for confirmation.",
    "short_label": "BUS SHEET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1567-1584",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1567-L1584"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1993-2000",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1993-L2000"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "273-290",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L273-L290"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "321-323",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L321-L323"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "159-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L159-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "352-370",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
     }
    ]
   },
   {
    "mode": "shared_fx_sheet",
    "gesture": "release",
    "action": "On Routing, switches CHAIN and SPLIT; Clear shared FX opens a question, then OCT+ resets the three shared slots to defaults with their effects off and TONE at FULL.",
    "short_label": "BUS ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "159-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L159-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "352-370",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "163-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L163-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "342-347",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L342-L347"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_draw.c",
      "lines": "912-915",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L912-L915"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1917-1922",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1917-L1922"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "249-266",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L249-L266"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "MIXER; each further press goes to GLOBAL, then SYSTEM, then back to MIXER. Acts when you let go before the hold time.",
    "short_label": "MIXER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1617-1620",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1617-L1620"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "570-585",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L570-L585"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held past the hold time (0.4 s by default; Settings > HOLD sets 0.3-0.6 s): the GLO layer. A key or knob used meanwhile opens it at once.",
    "short_label": "GLO LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "150-176",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L150-L176"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/panel.c",
      "lines": "74-79",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/panel.c#L74-L79"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "double_press",
    "action": "Double-press (within 0.3 s): the GLO layer stays open without holding. GLO again, or any button but PLAY, REC and OCT, closes it.",
    "short_label": "LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "168-175",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L168-L175"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "136-147",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L136-L147"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "51",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L51"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Scale pages: SCALES, then the SCL list, then CHORD, then round again. From another page it reopens the last scale page used.",
    "short_label": "SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1639-1643",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1639-L1643"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "534-567",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L534-L567"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "520-522",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L520-L522"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_list.c",
      "lines": "14-25",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L14-L25"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Held past the hold time: the SCL layer (a key sets the root; the knobs set root, scale, chord, voicing).",
    "short_label": "SCL LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "150-176",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L150-L176"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "double_press",
    "action": "Double-press: the SCL layer stays open until SCL or another button closes it.",
    "short_label": "LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "168-175",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L168-L175"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "136-147",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L136-L147"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "hold",
    "action": "On NOTES (synth track) SCL is a note modifier, not a layer: hold it and turn SELECT or KNOB 1 to move the note. A plain tap still opens the scale pages.",
    "short_label": "MOVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1291-1302",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1291-L1302"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1664-1686",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1664-L1686"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2439-2454",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2439-L2454"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Envelope pages; each press the next one, and from another page it reopens the last one used. PROPHET, FM6 and CZ-1 show their own envelopes (the track ENV hides); SID and DRUM show ENV and ENV DEST.",
    "short_label": "ENV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1639-1643",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1639-L1643"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "534-567",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L534-L567"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "226-242",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L226-L242"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "254-269",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L254-L269"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "hold",
    "action": "On NOTES ENV is a note modifier: while it is held, SELECT or KNOB 1 changes the note's length, KNOB 3 sets it in 1/16 steps, KNOB 4 toggles slide.",
    "short_label": "NOTE LEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1291-1302",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1291-L1302"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1664-1686",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1664-L1686"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "898-937",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L898-L937"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "LFO pages: the engine's own first (PROPHET, FM6, CZ-1), then the track LFO, LFO 2, LFO DEST and MOD. From another page it reopens the last one used.",
    "short_label": "LFO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1639-1643",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1639-L1643"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "534-567",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L534-L567"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "226-242",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L226-L242"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Hold and turn knobs on most value pages (Stage, sound, ENV, LFO, effect insert, ARP, PATTERN, TEMPO's BPM and swing): temporary changes, put back when you let go of LFO (OCT+ keeps them).",
    "short_label": "TEMP TWEAK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "691-711",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L691-L711"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2460",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2460"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2308",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2308"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RECORDING_PERFORMANCE.md#L74-L80",
      "path": "docs/RECORDING_PERFORMANCE.md",
      "lines": "74-80",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens the selected track's sound pages, grouped in categories. Reopens the last page used. Tap on a sound page opens the category map; the header shows the page position.",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1604-1616",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1604-L1616"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_pages.c",
      "lines": "887-903",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_pages.c#L887-L903"
     }
    ]
   },
   {
    "mode": "edit",
    "gesture": "press",
    "action": "On a sound page: opens the section map; press again to close it.",
    "short_label": "MAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1608-1615",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1608-L1615"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_sections.c",
      "lines": "3-9",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_sections.c#L3-L9"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Held about 0.7 s: undo a recorded take, sound or pattern load, Capture or motion edit. Hold again for earlier load history (up to eight levels); NOTES and DRUM HIT undo note edits first. Finish recording before undoing the take.",
    "short_label": "UNDO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2155-2165",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2155-L2165"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "606-613",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L606-L613"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "779-800",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L779-L800"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/recording_undo.c",
      "lines": "83-98",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/recording_undo.c#L83-L98"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "On NOTES (synth track): deletes the highlighted note; a chord keeps its other notes.",
    "short_label": "DELETE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2439-2454",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2439-L2454"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1430-1453",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1430-L1453"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L649-L658",
      "path": "README.md",
      "lines": "649-658",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "hold",
    "action": "During live recording on NOTES: hold EDIT to erase notes as the playhead passes. Release stops erasing. After the take finishes, whole-take undo can restore the erased material.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1688-1715",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1688-L1715"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq_erase.c",
      "lines": "59-93",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq_erase.c#L59-L93"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/recording_undo.c",
      "lines": "83-120",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/recording_undo.c#L83-L120"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Clears the cursor step's hits and moves the cursor on.",
    "short_label": "CLR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1621-1634",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1621-L1634"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Deletes the selected hit.",
    "short_label": "DEL HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1616",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1616"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "press",
    "action": "Renames the selected slot (opens NAME).",
    "short_label": "RENAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1635-1638",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1635-L1638"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "press",
    "action": "Renames the selected project (opens NAME).",
    "short_label": "RENAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1635-1638",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1635-L1638"
     }
    ]
   },
   {
    "mode": "edit_map",
    "gesture": "press",
    "action": "Closes the section map.",
    "short_label": "CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1608-1615",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1608-L1615"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Arpeggiator pages: ARP, then ARP 2 (from another page it reopens the last one used).",
    "short_label": "ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1639-1643",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1639-L1643"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "534-567",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L534-L567"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "596-597",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L596-L597"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Sequencer pages: NOTES, PATTERN, TEMPO, PATTERNS, SONG, then MOTION (once there is motion) and DRUM HIT (DRUM tracks). From elsewhere it returns to the last one used.",
    "short_label": "SEQ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2220-2221",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2220-L2221"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "534-567",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L534-L567"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "598-606",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L598-L606"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "254-269",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L254-L269"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Held about 0.7 s: opens PATTERNS. On MOTION, an unused hold opens it on release so SEQ can modify motion controls.",
    "short_label": "PATTERNS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1986-1993",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1986-L1993"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2217-2222",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2217-L2222"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "hold",
    "action": "While held: the first eight white keys choose patterns; the first four black keys select tracks. An empty pattern arms one pass only when this track is unarmed; a continuous REC arm already in place stays continuous. Double-tap a used pattern key to toggle REC. Hold a pattern key for 1 s for Delete or Copy. SELECT also changes patterns.",
    "short_label": "PAT KEYS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "104-112",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L104-L112"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "249-348",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L249-L348"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2415-2419",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2415-L2419"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "265-281",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "1033-1040",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
     }
    ]
   }
  ],
  "button_fx": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Opens the FX rack. From a slot page or SHARED, FX returns to that rack. From the rack, another press advances to the next active slot or SHARED; SELECT also moves through those pages.",
    "short_label": "FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "534-565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L534-L565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "254-258",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L254-L258"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "503-513",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L503-L513"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "No hold function: FX has no quick layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "27-35",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L27-L35"
     }
    ]
   }
  ],
  "encoder_select": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Steps back and forth through the open section's pages, wrapping at the ends (on EDIT pages across the sections).",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2421-2423",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2421-L2423"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "500-514",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L500-L514"
     }
    ]
   },
   {
    "mode": "stage",
    "gesture": "turn",
    "action": "On either HOME view, turns the setting chosen in Settings > HOME SELECT: BPM by default, or mod wheel, level, swing, transpose, chord, arp rate, pattern, OFF. Mod wheel also sends MIDI CC1.",
    "short_label": "HOME SELECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "79-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L79-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1827-1896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1827-L1896"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2421-2425",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2421-L2425"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_seq",
    "action": "SEQ held: the selected track's next or previous pattern (queued to its loop end while playing).",
    "short_label": "PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2415-2419",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2415-L2419"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn_while_holding:button_env",
    "action": "ENV held on NOTES: makes the note longer or shorter.",
    "short_label": "NOTE LEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1664-1686",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1664-L1686"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn_while_holding:button_sel",
    "action": "SCL held on NOTES: moves the note with its ties, chord and velocity.",
    "short_label": "MOVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1664-1686",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1664-L1686"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn",
    "action": "While you still hold the key(s) of a note you are entering: sets its length. Otherwise it turns the SEQ pages.",
    "short_label": "LEN/PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1664-1686",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1664-L1686"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2412-2427",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2412-L2427"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_oct_up",
    "action": "OCT+ held on NOTES, USER or a STORE page: selects a range of notes or slots; then OCT+ opens the selection's sheet.",
    "short_label": "RANGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1823",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1814-L1823"
     }
    ]
   },
   {
    "mode": "designer",
    "gesture": "turn",
    "action": "Moves through the designer's pages across stages.",
    "short_label": "PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "58-73",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L58-L73"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Not used in the menu, questions or sheets.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_menu.c",
      "lines": "451",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_menu.c#L451"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2170-2183",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2170-L2183"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_glo",
    "action": "GLO held: turns Settings > GLO SELECT on any page, through the same choices as HOME SELECT. BPM is the default.",
    "short_label": "GLO SELECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "79-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L79-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2041-2047",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2041-L2047"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2083-2087",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2083-L2087"
     }
    ]
   },
   {
    "mode": "edit_map",
    "gesture": "turn",
    "action": "Moves across the chosen category's pages, like KNOB 1.",
    "short_label": "MAP PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2184-2192",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2184-L2192"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_sections.c",
      "lines": "221-250",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_sections.c#L221-L250"
     }
    ]
   },
   {
    "mode": "chord_view",
    "gesture": "turn",
    "action": "On either HOME view, turns the setting chosen in Settings > HOME SELECT: BPM by default, or mod wheel, level, swing, transpose, chord, arp rate, pattern, OFF. Mod wheel also sends MIDI CC1.",
    "short_label": "HOME SELECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_view.c",
      "lines": "3-11",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_view.c#L3-L11"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "79-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L79-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1827-1896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1827-L1896"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2421-2425",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2421-L2425"
     }
    ]
   }
  ],
  "encoder_algorithm": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Selects a track in use, from track 1 to the last active track, stopping at the ends. Ignored in the menu, questions, sheets, the designer, and while a layer button is held.",
    "short_label": "TRACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "1074-1090",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L1074-L1090"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2408-2411",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2408-L2411"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2064-2075",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2064-L2075"
     }
    ]
   }
  ],
  "encoder_presets": [
   {
    "mode": "stage",
    "gesture": "turn",
    "action": "Changes the selected track's sound through the browser's chosen list. A fast spin loads when the knob rests. Hold EDIT to return to the sound from before browsing.",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2389-2404",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2389-L2404"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "606-613",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L606-L613"
     }
    ]
   },
   {
    "mode": "browser",
    "gesture": "turn",
    "action": "Moves through the sounds (as KNOB 2).",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2393-2397",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2393-L2397"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_browser.c",
      "lines": "1-9",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_browser.c#L1-L9"
     }
    ]
   },
   {
    "mode": "scales",
    "gesture": "turn",
    "action": "Browses the scales.",
    "short_label": "SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2391-2392",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2391-L2392"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn",
    "action": "Zooms the piano roll around the selected note, from 16 steps down to one.",
    "short_label": "ZOOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2398-2400",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2398-L2400"
     }
    ]
   },
   {
    "mode": "edit",
    "gesture": "turn",
    "action": "Next or previous section of the sound pages (on FM6, operator by operator).",
    "short_label": "SECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2401-2403",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2401-L2403"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_sections.c",
      "lines": "129-134",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_sections.c#L129-L134"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Moves through the settings, wrapping; on About scrolls the credits.",
    "short_label": "ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_menu.c",
      "lines": "346-350",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_menu.c#L346-L350"
     }
    ]
   },
   {
    "mode": "designer",
    "gesture": "turn",
    "action": "Next or previous stage.",
    "short_label": "STAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "58-73",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L58-L73"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Anywhere else PRESETS does nothing, so a stray turn never swaps the sound you are editing. Ignored while a layer button is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2393-2397",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2393-L2397"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2064-2075",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2064-L2075"
     }
    ]
   },
   {
    "mode": "chord_view",
    "gesture": "turn",
    "action": "Changes the selected track's sound through the browser's chosen list. A fast spin loads when the knob rests. Hold EDIT to return to the sound from before browsing.",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_view.c",
      "lines": "3-11",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_view.c#L3-L11"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2389-2404",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2389-L2404"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "606-613",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L606-L613"
     }
    ]
   }
  ],
  "encoder_knob1": [
   {
    "mode": "stage",
    "gesture": "turn",
    "action": "PROPHET: cutoff. FM6: MLVL. CZ-1: wave. SID: wave. DRUM: tune.",
    "short_label": "SOUND 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "1051-1067",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L1051-L1067"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1802",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1797-L1802"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_stage.c",
      "lines": "69",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L69"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "1118-1125",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L1118-L1125"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "1131",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L1131"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "547-554",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L547-L554"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "560",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L560"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "468-475",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L468-L475"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "483",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L483"
     }
    ]
   },
   {
    "mode": "fx_insert",
    "gesture": "turn",
    "action": "Insert slot's mix.",
    "short_label": "MIX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "506-513",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L506-L513"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "777-782",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L777-L782"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "282-289",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L282-L289"
     }
    ]
   },
   {
    "mode": "send_fx",
    "gesture": "turn",
    "action": "Shared slot's mix.",
    "short_label": "SHARED MIX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "506-513",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L506-L513"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "777-782",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L777-L782"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "282-289",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L282-L289"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "turn",
    "action": "ENV: attack. ENV DEST: amount to filter.",
    "short_label": "ATK/FLT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "514-515",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L514-L515"
     }
    ]
   },
   {
    "mode": "native_env",
    "gesture": "turn",
    "action": "The page's first value (an envelope rate or level, or a PROPHET envelope stage).",
    "short_label": "VALUE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1068-1070",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1068-L1070"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "536-538",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L536-L538"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "550-551",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L550-L551"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "action": "LFO: rate. LFO 2: tempo sync. LFO DEST: amount to pitch.",
    "short_label": "RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "516-518",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L516-L518"
     }
    ]
   },
   {
    "mode": "mod",
    "gesture": "turn",
    "action": "Source of the route shown (LFO, ENV, velocity, key, random, mod wheel, aftertouch, expression and more).",
    "short_label": "SOURCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "519",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L519"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1059-1067",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1059-L1067"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "47",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L47"
     }
    ]
   },
   {
    "mode": "native_lfo",
    "gesture": "turn",
    "action": "The engine LFO page's first value.",
    "short_label": "VALUE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1068-1070",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1068-L1070"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "541-542",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L541-L542"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "556-557",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L556-L557"
     }
    ]
   },
   {
    "mode": "scales",
    "gesture": "turn",
    "action": "Scale family (or ALL, FAV).",
    "short_label": "FAMILY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "520",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L520"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/scale_picker.c",
      "lines": "56-72",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/scale_picker.c#L56-L72"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "15",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L15"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "turn",
    "action": "Changes the selected row: root, scale, QNT, MPC degree, transpose, or favourite on/off.",
    "short_label": "VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_list.c",
      "lines": "140-158",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L140-L158"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_list.c",
      "lines": "14-25",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L14-L25"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1018-1021",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1018-L1021"
     }
    ]
   },
   {
    "mode": "chord",
    "gesture": "turn",
    "action": "Chord keys: OFF, triads or seventh chords built from the scale, or one fixed shape (MAJ, MIN, DOM7, MAJ7, MIN7, SUS4, POW).",
    "short_label": "CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "522",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L522"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "17-18",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L17-L18"
     }
    ]
   },
   {
    "mode": "edit",
    "gesture": "turn",
    "action": "The page's first value (names change with engine and page).",
    "short_label": "VALUE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1068-1070",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1068-L1070"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1772-1805",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1772-L1805"
     }
    ]
   },
   {
    "mode": "edit_map",
    "gesture": "turn",
    "action": "Moves across pages of the chosen category, one page per detent; each category remembers its last page.",
    "short_label": "ACROSS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_sections.c",
      "lines": "221-250",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_sections.c#L221-L250"
     }
    ]
   },
   {
    "mode": "voice_lists",
    "gesture": "turn",
    "action": "Changes the selected row's value.",
    "short_label": "VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_list.c",
      "lines": "140-158",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L140-L158"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_list.c",
      "lines": "14-25",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L14-L25"
     }
    ]
   },
   {
    "mode": "store",
    "gesture": "turn",
    "action": "Picks one of the 384 shared slots; STORE and USER refer to the same bank.",
    "short_label": "SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "99-100",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L99-L100"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "16-32",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L16-L32"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/core.h",
      "lines": "66",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/core.h#L66"
     }
    ]
   },
   {
    "mode": "cz_tools",
    "gesture": "turn",
    "action": "Right picks NAME, left drops it; OCT+ does it.",
    "short_label": "NAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1050-1053",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1050-L1053"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1165-1179",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1165-L1179"
     }
    ]
   },
   {
    "mode": "drum_sound",
    "gesture": "turn",
    "action": "Picks the drum in black-key lane order: kick, snare, clap, closed hat, open hat, toms, rim, bell. Related drums stay together; the matching lane is selected too.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "82-91",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L82-L91"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "743-755",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L743-L755"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "814-824",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L814-L824"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Level of the selected track.",
    "short_label": "LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "482-505",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L482-L505"
     }
    ]
   },
   {
    "mode": "global",
    "gesture": "turn",
    "action": "A4 reference pitch, 400-480 Hz (440 default), kept with the device.",
    "short_label": "A4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "591-592",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L591-L592"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "222-225",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L222-L225"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/tuning.h",
      "lines": "4-6",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/tuning.h#L4-L6"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "24-26",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L24-L26"
     }
    ]
   },
   {
    "mode": "system",
    "gesture": "turn",
    "action": "Which MIDI input's activity shows: USB or TRS (both always play).",
    "short_label": "MIDI IN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "591-592",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L591-L592"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "234-237",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L234-L237"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "24-26",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L24-L26"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "turn",
    "action": "Picks any shared user slot, U001-U384; every slot can hold any engine.",
    "short_label": "SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1054-1058",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1054-L1058"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/core.h",
      "lines": "65-66",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/core.h#L65-L66"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "turn",
    "action": "Picks the slot (A-D, T); past T: New song.",
    "short_label": "SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1787-1791",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1787-L1791"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "961-965",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L961-L965"
     }
    ]
   },
   {
    "mode": "browser",
    "gesture": "turn",
    "action": "The list: All, Faves, Recent or a category (kept with the device).",
    "short_label": "LIST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1022-1042",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1022-L1042"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "action": "ARP: mode (OFF, UP, DN, UPDN, RND, ORD, REPEAT). ARP 2: swing.",
    "short_label": "MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "596-597",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L596-L597"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "8",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L8"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn",
    "action": "Walks the steps and notes one by one, empty steps too.",
    "short_label": "STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "898-937",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L898-L937"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L622-L643",
      "path": "README.md",
      "lines": "622-643",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "turn",
    "action": "Cursor step.",
    "short_label": "STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "757-768",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L757-L768"
     }
    ]
   },
   {
    "mode": "pattern",
    "gesture": "turn",
    "action": "Pattern length (steps).",
    "short_label": "LEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "599",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L599"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "9",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L9"
     }
    ]
   },
   {
    "mode": "tempo",
    "gesture": "turn",
    "action": "Tempo, 40-240 BPM (saved with the project).",
    "short_label": "BPM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "600",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L600"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "222-225",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L222-L225"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "turn",
    "action": "Queues track 1's next pattern (during Copy to: moves the target).",
    "short_label": "T1 PAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_patterns.c",
      "lines": "258-272",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_patterns.c#L258-L272"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Section.",
    "short_label": "SECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "970-999",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L970-L999"
     }
    ]
   },
   {
    "mode": "motion",
    "gesture": "turn",
    "action": "Motion playback on or off.",
    "short_label": "PLAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_motion.c",
      "lines": "166-220",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_motion.c#L166-L220"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "turn",
    "action": "Walks the hits one by one.",
    "short_label": "HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "826-831",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L826-L831"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "845-846",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L845-L846"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn",
    "action": "Track 1 level.",
    "short_label": "T1 LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "267-284",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L267-L284"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "turn",
    "action": "Root.",
    "short_label": "ROOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "267-284",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L267-L284"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "35",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L35"
     }
    ]
   },
   {
    "mode": "sheet",
    "gesture": "turn",
    "action": "Changes the selected row's value, where it has one.",
    "short_label": "VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "352-370",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "449-470",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L449-L470"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Changes the selected setting.",
    "short_label": "VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_menu.c",
      "lines": "351-425",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_menu.c#L351-L425"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_menu.c",
      "lines": "344-345",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_menu.c#L344-L345"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "turn",
    "action": "Moves the cursor.",
    "short_label": "CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "266-300",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L266-L300"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     }
    ]
   },
   {
    "mode": "new_song",
    "gesture": "turn",
    "action": "Key screen: root. Roles screen: track 1's role; -- omits that place; at least one track remains.",
    "short_label": "ROOT/T1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_new.c",
      "lines": "16-17",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_new.c#L16-L17"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_new.c",
      "lines": "114-129",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_new.c#L114-L129"
     }
    ]
   },
   {
    "mode": "designer",
    "gesture": "turn",
    "action": "Start screen: engine. Stages: the page's first control (on FEATURES the row's value).",
    "short_label": "ENGINE/V1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "45-56",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L45-L56"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "58-73",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L58-L73"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/SOUND_DESIGNER.md#L7-L17",
      "path": "docs/SOUND_DESIGNER.md",
      "lines": "7-17",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn",
    "action": "On a four-value page: changes this column's value. Long named lists can show a picker (Settings > PICKER POPUPS); spins accelerate unless KNOB ACCEL is off. Changes made while the track records are captured as motion; armed but stopped, the screen asks for playback.",
    "short_label": "VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1772-1805",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1772-L1805"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1118",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1114-L1118"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_menu.c",
      "lines": "401-410",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_menu.c#L401-L410"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_lfo",
    "action": "LFO held: a temporary change, put back when LFO is let go (OCT+ keeps it). Not recorded as motion.",
    "short_label": "TEMP TWEAK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "691-711",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L691-L711"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RECORDING_PERFORMANCE.md#L74-L80",
      "path": "docs/RECORDING_PERFORMANCE.md",
      "lines": "74-80",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_oct_up",
    "action": "OCT+ held on NOTES, USER or a STORE page: extends a range selection; then OCT+ opens its sheet (move, copy, quantize, delete; or send, erase).",
    "short_label": "RANGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2432",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2432"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1823",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1814-L1823"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1825",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1825"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "117-152",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L117-L152"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn_while_holding:button_env",
    "action": "ENV held on NOTES: resizes the note.",
    "short_label": "NOTE LEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2433-2435",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2433-L2435"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn_while_holding:button_sel",
    "action": "SCL held on NOTES: moves the note.",
    "short_label": "MOVE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2433-2435",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2433-L2435"
     }
    ]
   },
   {
    "mode": "fx_rack",
    "gesture": "turn",
    "action": "Chooses the effect for the selected insert slot; the Shared row has no effect type.",
    "short_label": "FX TYPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "669-680",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L669-L680"
     }
    ]
   },
   {
    "mode": "shared_fx",
    "gesture": "turn",
    "action": "Chooses the shared row's effect. RETURN has no effect type.",
    "short_label": "SHARED TYPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "681-688",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L681-L688"
     }
    ]
   },
   {
    "mode": "chord_view",
    "gesture": "turn",
    "action": "PROPHET: cutoff. FM6: MLVL. CZ-1: wave. SID: wave. DRUM: tune.",
    "short_label": "SOUND 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_view.c",
      "lines": "3-11",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_view.c#L3-L11"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "1051-1067",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L1051-L1067"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1802",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1797-L1802"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_stage.c",
      "lines": "69",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L69"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "1118-1125",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L1118-L1125"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "1131",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L1131"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "547-554",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L547-L554"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "560",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L560"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "468-475",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L468-L475"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "483",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L483"
     }
    ]
   },
   {
    "mode": "sid_chip",
    "gesture": "turn",
    "action": "SID MODEL: 6581 or 8580, or C64 6581/C64 8580. C64 uses one voice per track, updates registers at PAL frame rate, and arpeggiates held POLY chords a note per frame.",
    "short_label": "SID MODEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "34-41",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L34-L41"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "47-61",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L47-L61"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "332-354",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L332-L354"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "545-554",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L545-L554"
     }
    ]
   },
   {
    "mode": "drum_kit",
    "gesture": "turn",
    "action": "Chooses the synthesized 808, 909 or SID kit. SID uses one 6581 chip for the track.",
    "short_label": "KIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "148",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L148"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "447-475",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L447-L475"
     }
    ]
   },
   {
    "mode": "shared_fx_sheet",
    "gesture": "turn",
    "action": "On Routing, turn left for CHAIN or right for SPLIT; the Clear shared FX row has no value to turn.",
    "short_label": "BUS ROUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "159-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L159-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "352-370",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
     }
    ]
   }
  ],
  "encoder_knob2": [
   {
    "mode": "stage",
    "gesture": "turn",
    "action": "PROPHET: resonance. FM6: MRAT. CZ-1: DCW. SID: pulse width. DRUM: tone.",
    "short_label": "SOUND 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "1051-1067",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L1051-L1067"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1802",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1797-L1802"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_stage.c",
      "lines": "69",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L69"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "1118-1125",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L1118-L1125"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "1131",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L1131"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "547-554",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L547-L554"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "560",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L560"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "468-475",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L468-L475"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "483",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L483"
     }
    ]
   },
   {
    "mode": "fx_insert",
    "gesture": "turn",
    "action": "Insert slot's rate; ECHO time, ROOM and REVERB size.",
    "short_label": "RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "506-513",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L506-L513"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "777-782",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L777-L782"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "282-289",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L282-L289"
     }
    ]
   },
   {
    "mode": "send_fx",
    "gesture": "turn",
    "action": "Shared slot's rate; ECHO time, ROOM and REVERB size.",
    "short_label": "SHARED RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "506-513",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L506-L513"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "777-782",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L777-L782"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "282-289",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L282-L289"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "turn",
    "action": "ENV: decay. ENV DEST: amount to pitch.",
    "short_label": "DEC/PIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "514-515",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L514-L515"
     }
    ]
   },
   {
    "mode": "native_env",
    "gesture": "turn",
    "action": "The page's second value.",
    "short_label": "VALUE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1068-1070",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1068-L1070"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "536-538",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L536-L538"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "550-551",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L550-L551"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "action": "LFO: wave. LFO 2: retrigger (note or free). LFO DEST: to filter.",
    "short_label": "WAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "516-518",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L516-L518"
     }
    ]
   },
   {
    "mode": "mod",
    "gesture": "turn",
    "action": "Which of the four routes.",
    "short_label": "ROUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "519",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L519"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1059-1067",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1059-L1067"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "47",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L47"
     }
    ]
   },
   {
    "mode": "native_lfo",
    "gesture": "turn",
    "action": "Second value.",
    "short_label": "VALUE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1068-1070",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1068-L1070"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "541-542",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L541-L542"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "556-557",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L556-L557"
     }
    ]
   },
   {
    "mode": "scales",
    "gesture": "turn",
    "action": "Scale within the family.",
    "short_label": "SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "520",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L520"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/scale_picker.c",
      "lines": "56-72",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/scale_picker.c#L56-L72"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "15",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L15"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "turn",
    "action": "Moves between the rows.",
    "short_label": "ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_list.c",
      "lines": "140-158",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L140-L158"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_list.c",
      "lines": "14-25",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L14-L25"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1018-1021",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1018-L1021"
     }
    ]
   },
   {
    "mode": "chord",
    "gesture": "turn",
    "action": "Voicing: close, open, first or second inversion, added octave.",
    "short_label": "VOICING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "522",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L522"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "17-18",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L17-L18"
     }
    ]
   },
   {
    "mode": "edit",
    "gesture": "turn",
    "action": "Second value.",
    "short_label": "VALUE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1068-1070",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1068-L1070"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1772-1805",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1772-L1805"
     }
    ]
   },
   {
    "mode": "edit_map",
    "gesture": "turn",
    "action": "Moves between categories, returning to the last page used in each.",
    "short_label": "DOWN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_sections.c",
      "lines": "221-250",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_sections.c#L221-L250"
     }
    ]
   },
   {
    "mode": "voice_lists",
    "gesture": "turn",
    "action": "Moves between the rows.",
    "short_label": "ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_list.c",
      "lines": "140-158",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L140-L158"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_list.c",
      "lines": "14-25",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L14-L25"
     }
    ]
   },
   {
    "mode": "store",
    "gesture": "turn",
    "action": "Picks one of the 384 shared slots; STORE and USER refer to the same bank.",
    "short_label": "SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "99-100",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L99-L100"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "16-32",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L16-L32"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/core.h",
      "lines": "66",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/core.h#L66"
     }
    ]
   },
   {
    "mode": "cz_tools",
    "gesture": "turn",
    "action": "Picks LINE 1>2.",
    "short_label": "LINE 1>2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1050-1053",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1050-L1053"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1165-1179",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1165-L1179"
     }
    ]
   },
   {
    "mode": "drum_sound",
    "gesture": "turn",
    "action": "DRUM SOUND: tuning in semitones. DRUM MIX: level.",
    "short_label": "TUNE/LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "814-824",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L814-L824"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_draw.c",
      "lines": "621-627",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L621-L627"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Pan.",
    "short_label": "PAN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "482-505",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L482-L505"
     }
    ]
   },
   {
    "mode": "system",
    "gesture": "turn",
    "action": "Drum MIDI channel (OFF or 1-16, 10 by default), kept with the device.",
    "short_label": "DRUM CH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "591-592",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L591-L592"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "234-237",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L234-L237"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "24-26",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L24-L26"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "turn",
    "action": "Picks any shared user slot, U001-U384.",
    "short_label": "SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1787-1790",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1787-L1790"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1054-1058",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1054-L1058"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/core.h",
      "lines": "66",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/core.h#L66"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "turn",
    "action": "Picks the slot.",
    "short_label": "SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1787-1791",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1787-L1791"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "961-965",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L961-L965"
     }
    ]
   },
   {
    "mode": "browser",
    "gesture": "turn",
    "action": "The sound in that list.",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1022-1042",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1022-L1042"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "action": "ARP: rate. ARP 2: probability.",
    "short_label": "RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "596-597",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L596-L597"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "8",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L8"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn",
    "action": "Pitch of the highlighted note; on an empty step, inserts a note.",
    "short_label": "PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "898-937",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L898-L937"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L622-L643",
      "path": "README.md",
      "lines": "622-643",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "turn",
    "action": "Lane.",
    "short_label": "LANE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "757-768",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L757-L768"
     }
    ]
   },
   {
    "mode": "pattern",
    "gesture": "turn",
    "action": "Step division (1/32 to 4 bars).",
    "short_label": "DIV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "599",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L599"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "9",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L9"
     }
    ]
   },
   {
    "mode": "tempo",
    "gesture": "turn",
    "action": "Swing.",
    "short_label": "SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "600",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L600"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "222-225",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L222-L225"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "turn",
    "action": "Track 2's pattern.",
    "short_label": "T2 PAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_patterns.c",
      "lines": "258-272",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_patterns.c#L258-L272"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Track (selects it).",
    "short_label": "TRACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "970-999",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L970-L999"
     }
    ]
   },
   {
    "mode": "motion",
    "gesture": "turn",
    "action": "Which lane.",
    "short_label": "LANE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_motion.c",
      "lines": "166-220",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_motion.c#L166-L220"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "turn",
    "action": "Picks a drum in black-key lane order, with related drums together, and selects its matching lane.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "82-91",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L82-L91"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "826-831",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L826-L831"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn",
    "action": "Track 2 level.",
    "short_label": "T2 LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "267-284",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L267-L284"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "turn",
    "action": "Scale.",
    "short_label": "SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "267-284",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L267-L284"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "35",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L35"
     }
    ]
   },
   {
    "mode": "sheet",
    "gesture": "turn",
    "action": "Moves between rows.",
    "short_label": "ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "352-370",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "449-470",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L449-L470"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Moves between settings.",
    "short_label": "ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_menu.c",
      "lines": "351-425",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_menu.c#L351-L425"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_menu.c",
      "lines": "344-345",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_menu.c#L344-L345"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "turn",
    "action": "Changes the character at the cursor.",
    "short_label": "CHAR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "266-300",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L266-L300"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     }
    ]
   },
   {
    "mode": "new_song",
    "gesture": "turn",
    "action": "Key screen: scale. Roles: track 2's role; -- omits that place; at least one track remains.",
    "short_label": "SCALE/T2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_new.c",
      "lines": "16-17",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_new.c#L16-L17"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_new.c",
      "lines": "114-129",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_new.c#L114-L129"
     }
    ]
   },
   {
    "mode": "designer",
    "gesture": "turn",
    "action": "Start: CURRENT, INIT or a recipe. Stages: second control (FEATURES: the row).",
    "short_label": "START/V2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "45-56",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L45-L56"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "58-73",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L58-L73"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/SOUND_DESIGNER.md#L7-L17",
      "path": "docs/SOUND_DESIGNER.md",
      "lines": "7-17",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn",
    "action": "On a four-value page: changes this column's value. Long named lists can show a picker (Settings > PICKER POPUPS); spins accelerate unless KNOB ACCEL is off. Changes made while the track records are captured as motion; armed but stopped, the screen asks for playback.",
    "short_label": "VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1772-1805",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1772-L1805"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1118",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1114-L1118"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_menu.c",
      "lines": "401-410",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_menu.c#L401-L410"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_lfo",
    "action": "LFO held: a temporary change, put back when LFO is let go (OCT+ keeps it). Not recorded as motion.",
    "short_label": "TEMP TWEAK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "691-711",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L691-L711"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RECORDING_PERFORMANCE.md#L74-L80",
      "path": "docs/RECORDING_PERFORMANCE.md",
      "lines": "74-80",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_oct_up",
    "action": "OCT+ held on NOTES, USER or a STORE page: extends a range selection.",
    "short_label": "RANGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2432",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2432"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1823",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1814-L1823"
     }
    ]
   },
   {
    "mode": "global",
    "gesture": "turn",
    "action": "Shared voice workload budget, 8-32 weighted points. Kept with device settings.",
    "short_label": "BUDGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "591",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L591"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1102-1108",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1102-L1108"
     }
    ]
   },
   {
    "mode": "fx_rack",
    "gesture": "turn",
    "action": "Chooses insert 1, 2, 3 or the Shared row.",
    "short_label": "FX SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1063-1066",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1063-L1066"
     }
    ]
   },
   {
    "mode": "shared_fx",
    "gesture": "turn",
    "action": "Chooses shared slot A, B, C or RETURN.",
    "short_label": "SHARED SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1063-1066",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1063-L1066"
     }
    ]
   },
   {
    "mode": "motion",
    "gesture": "turn_while_holding:button_seq",
    "action": "Clears the chosen motion lane immediately. EDIT held undoes it.",
    "short_label": "CLEAR LANE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_motion.c",
      "lines": "166-190",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_motion.c#L166-L190"
     }
    ]
   },
   {
    "mode": "chord_view",
    "gesture": "turn",
    "action": "PROPHET: resonance. FM6: MRAT. CZ-1: DCW. SID: pulse width. DRUM: tone.",
    "short_label": "SOUND 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_view.c",
      "lines": "3-11",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_view.c#L3-L11"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "1051-1067",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L1051-L1067"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1802",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1797-L1802"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_stage.c",
      "lines": "69",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L69"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "1118-1125",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L1118-L1125"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "1131",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L1131"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "547-554",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L547-L554"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "560",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L560"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "468-475",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L468-L475"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "483",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L483"
     }
    ]
   },
   {
    "mode": "shared_fx_sheet",
    "gesture": "turn",
    "action": "Chooses Routing or Clear shared FX.",
    "short_label": "BUS ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "159-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L159-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "352-370",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
     }
    ]
   }
  ],
  "encoder_knob3": [
   {
    "mode": "stage",
    "gesture": "turn",
    "action": "PROPHET: filter envelope amount. FM6: MEG. CZ-1: detune. SID: cutoff. DRUM: decay.",
    "short_label": "SOUND 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "1051-1067",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L1051-L1067"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1802",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1797-L1802"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_stage.c",
      "lines": "69",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L69"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "1118-1125",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L1118-L1125"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "1131",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L1131"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "547-554",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L547-L554"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "560",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L560"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "468-475",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L468-L475"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "483",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L483"
     }
    ]
   },
   {
    "mode": "fx_insert",
    "gesture": "turn",
    "action": "Insert slot's depth or character, depending on its effect.",
    "short_label": "CHARACTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "506-513",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L506-L513"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "777-782",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L777-L782"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "282-289",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L282-L289"
     }
    ]
   },
   {
    "mode": "send_fx",
    "gesture": "turn",
    "action": "Shared slot's depth or character, depending on the effect.",
    "short_label": "SHARED CHAR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "506-513",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L506-L513"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "777-782",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L777-L782"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "282-289",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L282-L289"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "turn",
    "action": "ENV: sustain. ENV DEST: amount to shape.",
    "short_label": "SUS/SHP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "514-515",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L514-L515"
     }
    ]
   },
   {
    "mode": "native_env",
    "gesture": "turn",
    "action": "The page's third value.",
    "short_label": "VALUE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1068-1070",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1068-L1070"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "536-538",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L536-L538"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "550-551",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L550-L551"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "action": "LFO: phase. LFO 2: polarity. LFO DEST: to shape.",
    "short_label": "PHASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "516-518",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L516-L518"
     }
    ]
   },
   {
    "mode": "mod",
    "gesture": "turn",
    "action": "Destination.",
    "short_label": "DEST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "519",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L519"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1059-1067",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1059-L1067"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "47",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L47"
     }
    ]
   },
   {
    "mode": "native_lfo",
    "gesture": "turn",
    "action": "Third value.",
    "short_label": "VALUE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1068-1070",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1068-L1070"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "541-542",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L541-L542"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "556-557",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L556-L557"
     }
    ]
   },
   {
    "mode": "scales",
    "gesture": "turn",
    "action": "Root.",
    "short_label": "ROOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "520",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L520"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/scale_picker.c",
      "lines": "56-72",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/scale_picker.c#L56-L72"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "15",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L15"
     }
    ]
   },
   {
    "mode": "edit",
    "gesture": "turn",
    "action": "Third value.",
    "short_label": "VALUE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1068-1070",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1068-L1070"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1772-1805",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1772-L1805"
     }
    ]
   },
   {
    "mode": "cz_tools",
    "gesture": "turn",
    "action": "Picks LINE 2>1.",
    "short_label": "LINE 2>1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1050-1053",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1050-L1053"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1165-1179",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1165-L1179"
     }
    ]
   },
   {
    "mode": "drum_sound",
    "gesture": "turn",
    "action": "DRUM SOUND: decay.",
    "short_label": "DECAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "814-824",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L814-L824"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_draw.c",
      "lines": "621-627",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L621-L627"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Not used.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "482-505",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L482-L505"
     }
    ]
   },
   {
    "mode": "global",
    "gesture": "turn",
    "action": "Clock source: INT, USB or TRS.",
    "short_label": "CLOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "591-592",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L591-L592"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "222-225",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L222-L225"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/tuning.h",
      "lines": "4-6",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/tuning.h#L4-L6"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "24-26",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L24-L26"
     }
    ]
   },
   {
    "mode": "system",
    "gesture": "turn",
    "action": "MIDI routing: a four-channel range (CH1-4, CH5-8, CH9-12 or CH13-16) to tracks 1-4, filtering other channels; SEL accepts every channel on the selected track. The drum-channel override obeys the range.",
    "short_label": "ROUTING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "24-26",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L24-L26"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "1109-1126",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1109-L1126"
     }
    ]
   },
   {
    "mode": "browser",
    "gesture": "turn",
    "action": "Favourite: right on, left off.",
    "short_label": "FAV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1022-1042",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1022-L1042"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "action": "ARP: octaves. ARP 2: hold (latch).",
    "short_label": "OCTAVES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "596-597",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L596-L597"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "8",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L8"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn",
    "action": "Length in quarter steps.",
    "short_label": "LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "898-937",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L898-L937"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L622-L643",
      "path": "README.md",
      "lines": "622-643",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "turn",
    "action": "Hit at the cursor: right on, left off.",
    "short_label": "HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "757-768",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L757-L768"
     }
    ]
   },
   {
    "mode": "pattern",
    "gesture": "turn",
    "action": "Swing.",
    "short_label": "SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "599",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L599"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "9",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L9"
     }
    ]
   },
   {
    "mode": "tempo",
    "gesture": "turn",
    "action": "Selected track's recording quantize: OFF keeps played timing, a division snaps the take when recording ends.",
    "short_label": "REC QNT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "600",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L600"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "222-225",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L222-L225"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "turn",
    "action": "Track 3's pattern.",
    "short_label": "T3 PAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_patterns.c",
      "lines": "258-272",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_patterns.c#L258-L272"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "That track's pattern in the section (adds a section past the end).",
    "short_label": "PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "970-999",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L970-L999"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "turn",
    "action": "This hit's pitch (+/-24).",
    "short_label": "PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "826-831",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L826-L831"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "845-846",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L845-L846"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn",
    "action": "Track 3 level.",
    "short_label": "T3 LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "267-284",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L267-L284"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "turn",
    "action": "Chord keys.",
    "short_label": "CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "267-284",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L267-L284"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "35",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L35"
     }
    ]
   },
   {
    "mode": "new_song",
    "gesture": "turn",
    "action": "Key screen: tempo. Roles: track 3's role; -- omits that place; at least one track remains.",
    "short_label": "BPM/T3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_new.c",
      "lines": "16-17",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_new.c#L16-L17"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_new.c",
      "lines": "114-129",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_new.c#L114-L129"
     }
    ]
   },
   {
    "mode": "designer",
    "gesture": "turn",
    "action": "Start: MAIN or ALL pages. Stages: third control.",
    "short_label": "PAGES/V3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "45-56",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L45-L56"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "58-73",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L58-L73"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/SOUND_DESIGNER.md#L7-L17",
      "path": "docs/SOUND_DESIGNER.md",
      "lines": "7-17",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn",
    "action": "On a four-value page: changes this column's value. Long named lists can show a picker (Settings > PICKER POPUPS); spins accelerate unless KNOB ACCEL is off. Changes made while the track records are captured as motion; armed but stopped, the screen asks for playback.",
    "short_label": "VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1772-1805",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1772-L1805"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1118",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1114-L1118"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_menu.c",
      "lines": "401-410",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_menu.c#L401-L410"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_lfo",
    "action": "LFO held: a temporary change, put back when LFO is let go (OCT+ keeps it). Not recorded as motion.",
    "short_label": "TEMP TWEAK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "691-711",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L691-L711"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RECORDING_PERFORMANCE.md#L74-L80",
      "path": "docs/RECORDING_PERFORMANCE.md",
      "lines": "74-80",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn_while_holding:button_env",
    "action": "ENV held on NOTES: length in 1/16-step steps.",
    "short_label": "FINE LEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "898-937",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L898-L937"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L622-L643",
      "path": "README.md",
      "lines": "622-643",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "shared_fx",
    "gesture": "turn",
    "action": "Routing: CHAIN or SPLIT.",
    "short_label": "ROUTING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "689-695",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L689-L695"
     }
    ]
   },
   {
    "mode": "motion",
    "gesture": "turn",
    "action": "Chooses the step to edit in the selected lane.",
    "short_label": "MOTION STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_motion.c",
      "lines": "166-184",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_motion.c#L166-L184"
     }
    ]
   },
   {
    "mode": "chord_view",
    "gesture": "turn",
    "action": "PROPHET: filter envelope amount. FM6: MEG. CZ-1: detune. SID: cutoff. DRUM: decay.",
    "short_label": "SOUND 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_view.c",
      "lines": "3-11",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_view.c#L3-L11"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "1051-1067",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L1051-L1067"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1802",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1797-L1802"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_stage.c",
      "lines": "69",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L69"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "1118-1125",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L1118-L1125"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "1131",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L1131"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "547-554",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L547-L554"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "560",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L560"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "468-475",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L468-L475"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "483",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L483"
     }
    ]
   },
   {
    "mode": "drum_hit_macros",
    "gesture": "turn",
    "action": "808/909: kick character PUNCH or ROUND. SID: DIGI off/on, sending kick and snare through the chip volume register when on.",
    "short_label": "KICK / DIGI",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "454-475",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L454-L475"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/drum_sid.c",
      "lines": "3-15",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/drum_sid.c#L3-L15"
     }
    ]
   }
  ],
  "encoder_knob4": [
   {
    "mode": "stage",
    "gesture": "turn",
    "action": "PROPHET: amp release. FM6: DTUN. CZ-1: vibrato. SID: resonance. DRUM: snap.",
    "short_label": "SOUND 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "1051-1067",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L1051-L1067"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1802",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1797-L1802"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_stage.c",
      "lines": "69",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L69"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "1118-1125",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L1118-L1125"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "1131",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L1131"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "547-554",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L547-L554"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "560",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L560"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "468-475",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L468-L475"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "483",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L483"
     }
    ]
   },
   {
    "mode": "fx_insert",
    "gesture": "turn",
    "action": "ECHO, ROOM and REVERB: tone from DARK through FULL to THIN. Blank for other effects.",
    "short_label": "TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "506-513",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L506-L513"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "777-782",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L777-L782"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "282-289",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L282-L289"
     }
    ]
   },
   {
    "mode": "send_fx",
    "gesture": "turn",
    "action": "Shared ECHO, ROOM or REVERB slot's tone: DARK through FULL to THIN. Blank for other effects.",
    "short_label": "SHARED TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "506-513",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L506-L513"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "777-782",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L777-L782"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "282-289",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L282-L289"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "turn",
    "action": "ENV: release.",
    "short_label": "REL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "514-515",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L514-L515"
     }
    ]
   },
   {
    "mode": "native_env",
    "gesture": "turn",
    "action": "The page's fourth value.",
    "short_label": "VALUE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1068-1070",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1068-L1070"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "536-538",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L536-L538"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "550-551",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L550-L551"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "action": "LFO: fade in. LFO DEST: to level.",
    "short_label": "FADE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "516-518",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L516-L518"
     }
    ]
   },
   {
    "mode": "mod",
    "gesture": "turn",
    "action": "Amount.",
    "short_label": "AMOUNT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "519",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L519"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1059-1067",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1059-L1067"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "47",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L47"
     }
    ]
   },
   {
    "mode": "native_lfo",
    "gesture": "turn",
    "action": "Fourth value.",
    "short_label": "VALUE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1068-1070",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1068-L1070"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "541-542",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L541-L542"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "556-557",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L556-L557"
     }
    ]
   },
   {
    "mode": "scales",
    "gesture": "turn",
    "action": "Key mode QNT: OFF, SNAP, WHITE, ALL, MPC.",
    "short_label": "QNT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "520",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L520"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/scale_picker.c",
      "lines": "56-72",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/scale_picker.c#L56-L72"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "15",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L15"
     }
    ]
   },
   {
    "mode": "edit",
    "gesture": "turn",
    "action": "Fourth value.",
    "short_label": "VALUE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1068-1070",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1068-L1070"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1772-1805",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1772-L1805"
     }
    ]
   },
   {
    "mode": "cz_tools",
    "gesture": "turn",
    "action": "Picks COMPARE (swap with the unedited tone).",
    "short_label": "COMPARE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1050-1053",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1050-L1053"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1165-1179",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1165-L1179"
     }
    ]
   },
   {
    "mode": "drum_sound",
    "gesture": "turn",
    "action": "DRUM SOUND: tone, snappy (snare) or the 909 voice's character.",
    "short_label": "TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "814-824",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L814-L824"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_draw.c",
      "lines": "621-627",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L621-L627"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Mute: right on, left off.",
    "short_label": "MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "482-505",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L482-L505"
     }
    ]
   },
   {
    "mode": "global",
    "gesture": "turn",
    "action": "Fine tune, -50 to +50 cents.",
    "short_label": "TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "591-592",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L591-L592"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "222-225",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L222-L225"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/tuning.h",
      "lines": "4-6",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/tuning.h#L4-L6"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "24-26",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L24-L26"
     }
    ]
   },
   {
    "mode": "system",
    "gesture": "turn",
    "action": "CPU load (read only).",
    "short_label": "CPU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "591-592",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L591-L592"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "234-237",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L234-L237"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "24-26",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L24-L26"
     }
    ]
   },
   {
    "mode": "browser",
    "gesture": "turn",
    "action": "Next or previous engine, starting from its init sound.",
    "short_label": "ENGINE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1022-1042",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1022-L1042"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "action": "ARP: gate. ARP 2: note order.",
    "short_label": "GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "596-597",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L596-L597"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "8",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L8"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn",
    "action": "Velocity 1-127.",
    "short_label": "VELOCITY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "898-937",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L898-L937"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L622-L643",
      "path": "README.md",
      "lines": "622-643",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "turn",
    "action": "Accent at the cursor: right on, left off.",
    "short_label": "ACCENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "757-768",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L757-L768"
     }
    ]
   },
   {
    "mode": "pattern",
    "gesture": "turn",
    "action": "Gate of entered steps.",
    "short_label": "GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "599",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L599"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "9",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L9"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "turn",
    "action": "Track 4's pattern.",
    "short_label": "T4 PAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_patterns.c",
      "lines": "258-272",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_patterns.c#L258-L272"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Repeats of the section, 1-16.",
    "short_label": "REPEATS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "970-999",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L970-L999"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "turn",
    "action": "This hit's length.",
    "short_label": "LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "826-831",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L826-L831"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "845-846",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L845-L846"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn",
    "action": "Track 4 level.",
    "short_label": "T4 LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "267-284",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L267-L284"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "turn",
    "action": "Voicing.",
    "short_label": "VOICING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "267-284",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L267-L284"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "35",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L35"
     }
    ]
   },
   {
    "mode": "new_song",
    "gesture": "turn",
    "action": "Roles screen: track 4's role: --, KEEP, DRUMS, BASS, CHORDS, LEAD or PAD. -- omits that place; at least one track remains.",
    "short_label": "T4 ROLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_new.c",
      "lines": "16-17",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_new.c#L16-L17"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_new.c",
      "lines": "114-129",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_new.c#L114-L129"
     }
    ]
   },
   {
    "mode": "designer",
    "gesture": "turn",
    "action": "Stages: fourth control.",
    "short_label": "VALUE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "45-56",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L45-L56"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_designer_input.c",
      "lines": "58-73",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_designer_input.c#L58-L73"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/SOUND_DESIGNER.md#L7-L17",
      "path": "docs/SOUND_DESIGNER.md",
      "lines": "7-17",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn",
    "action": "On a four-value page: changes this column's value. Long named lists can show a picker (Settings > PICKER POPUPS); spins accelerate unless KNOB ACCEL is off. Changes made while the track records are captured as motion; armed but stopped, the screen asks for playback.",
    "short_label": "VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1772-1805",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1772-L1805"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1118",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1114-L1118"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_menu.c",
      "lines": "401-410",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_menu.c#L401-L410"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_lfo",
    "action": "LFO held: a temporary change, put back when LFO is let go (OCT+ keeps it). Not recorded as motion.",
    "short_label": "TEMP TWEAK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "691-711",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L691-L711"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RECORDING_PERFORMANCE.md#L74-L80",
      "path": "docs/RECORDING_PERFORMANCE.md",
      "lines": "74-80",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "turn_while_holding:button_env",
    "action": "ENV held on NOTES: slide on (right) or off (left) for an entered note.",
    "short_label": "SLIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "898-937",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L898-L937"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L622-L643",
      "path": "README.md",
      "lines": "622-643",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "fx_rack",
    "gesture": "turn",
    "action": "Insert row: mix. Shared row in CHAIN: this track's send. In SPLIT, the Shared row has no amount.",
    "short_label": "FX AMOUNT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "696-714",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L696-L714"
     }
    ]
   },
   {
    "mode": "shared_fx",
    "gesture": "turn",
    "action": "Shared slot in CHAIN: mix. In SPLIT: selected track's send to this slot. RETURN row: shared return level.",
    "short_label": "BUS AMOUNT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "696-714",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L696-L714"
     }
    ]
   },
   {
    "mode": "motion",
    "gesture": "turn",
    "action": "Edits this step's held value, adding a point if needed. EDIT held undoes the edit.",
    "short_label": "MOTION VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_motion.c",
      "lines": "190-218",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_motion.c#L190-L218"
     }
    ]
   },
   {
    "mode": "motion",
    "gesture": "turn_while_holding:button_seq",
    "action": "Removes the motion point at the selected step immediately, if one exists. EDIT held undoes it.",
    "short_label": "CLEAR POINT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_motion.c",
      "lines": "166-195",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_motion.c#L166-L195"
     }
    ]
   },
   {
    "mode": "chord_view",
    "gesture": "turn",
    "action": "PROPHET: amp release. FM6: DTUN. CZ-1: vibrato. SID: resonance. DRUM: snap.",
    "short_label": "SOUND 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_view.c",
      "lines": "3-11",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_view.c#L3-L11"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "1051-1067",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L1051-L1067"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1797-1802",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1797-L1802"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_stage.c",
      "lines": "69",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L69"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "1118-1125",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L1118-L1125"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_fm6.c",
      "lines": "1131",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L1131"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "547-554",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L547-L554"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "560",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L560"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "468-475",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L468-L475"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "483",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L483"
     }
    ]
   },
   {
    "mode": "drum_hit_macros",
    "gesture": "turn",
    "action": "808/909: output drive. SID: chip-filter resonance.",
    "short_label": "DRIVE / RES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "454-475",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L454-L475"
     }
    ]
   }
  ],
  "knob_master": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Master volume. The metronome and count-in click keep their own level (Settings > CLICK LEVEL), even with MASTER at zero.",
    "short_label": "VOLUME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/main.c",
      "lines": "260-267",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/main.c#L260-L267"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RECORDING_PERFORMANCE.md#L45-L67",
      "path": "docs/RECORDING_PERFORMANCE.md",
      "lines": "45-67",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   }
  ],
  "key_f3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays F3 (MIDI 53 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "F3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "release",
    "action": "Selects pattern 1 of this track (playing: at the loop boundary); the empty-pattern shortcut sets up one recording pass only from an unarmed track, leaving an existing continuous REC arm unchanged.",
    "short_label": "PATTERN 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "263-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L319"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "265-281",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "1033-1040",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "hold",
    "action": "Solos track 1 while held. Does nothing if that track is not in use.",
    "short_label": "SOLO T1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to F.",
    "short_label": "ROOT F",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Step 1 of the page shown: toggles the selected lane's hit there (its accent while C#5 is held) and moves the cursor there.",
    "short_label": "STEP 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Step 1 of the page: moves there and adds or removes the selected drum's hit (accented while C#5 is held).",
    "short_label": "STEP 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "888-896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L888-L896"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters F3 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER F3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types AB (tap again within 0.8 s for the next character); in 123 mode types 1.",
    "short_label": "TYPE AB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L29-L31"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "long_press",
    "action": "After 1 s, opens the dialog for pattern 1; releasing the key then does not select it.",
    "short_label": "PAT MENU 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "297-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L297-L319"
     }
    ]
   },
   {
    "mode": "pattern_key_dialog",
    "gesture": "press",
    "action": "If pattern 1 is the dialog’s source, deletes it; otherwise copies the source to pattern 1. During playback, deleting a pattern or copying over a used/playing pattern waits for the track’s loop boundary.",
    "short_label": "TARGET P1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "253-260",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L253-L260"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "321-347",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L321-L347"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "double_press",
    "action": "A second tap within 0.3 s after selecting a used pattern toggles recording for that track.",
    "short_label": "REC TOGGLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "263-305",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L305"
     }
    ]
   }
  ],
  "key_fs3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays F#3 (MIDI 54 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "F#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Selects track 1 if it is in use; does nothing for an unused track place.",
    "short_label": "TRACK 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "107-119",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L107-L119"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "286-293",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L286-L293"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Mutes or unmutes track 1 (stays after you let go). Does nothing if that track is not in use.",
    "short_label": "MUTE T1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to F#.",
    "short_label": "ROOT F#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Selects the kick lane and plays it (recorded live when the track is armed and playing).",
    "short_label": "KICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "190-192",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L190-L192"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Selects this lane's drum for editing.",
    "short_label": "LANE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters F#3 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER F#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cursor left (repeats while held).",
    "short_label": "LEFT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "72-82",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     }
    ]
   }
  ],
  "key_g3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays G3 (MIDI 55 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "G3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "release",
    "action": "Selects pattern 2 of this track (playing: at the loop boundary); the empty-pattern shortcut sets up one recording pass only from an unarmed track, leaving an existing continuous REC arm unchanged.",
    "short_label": "PATTERN 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "263-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L319"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "265-281",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "1033-1040",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "hold",
    "action": "Solos track 2 while held. Does nothing if that track is not in use.",
    "short_label": "SOLO T2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to G.",
    "short_label": "ROOT G",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Step 2 of the page shown: toggles the selected lane's hit there (its accent while C#5 is held) and moves the cursor there.",
    "short_label": "STEP 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Step 2 of the page: moves there and adds or removes the selected drum's hit (accented while C#5 is held).",
    "short_label": "STEP 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "888-896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L888-L896"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters G3 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER G3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types CD (tap again within 0.8 s for the next character); in 123 mode types 2.",
    "short_label": "TYPE CD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L29-L31"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "long_press",
    "action": "After 1 s, opens the dialog for pattern 2; releasing the key then does not select it.",
    "short_label": "PAT MENU 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "297-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L297-L319"
     }
    ]
   },
   {
    "mode": "pattern_key_dialog",
    "gesture": "press",
    "action": "If pattern 2 is the dialog’s source, deletes it; otherwise copies the source to pattern 2. During playback, deleting a pattern or copying over a used/playing pattern waits for the track’s loop boundary.",
    "short_label": "TARGET P2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "253-260",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L253-L260"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "321-347",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L321-L347"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "double_press",
    "action": "A second tap within 0.3 s after selecting a used pattern toggles recording for that track.",
    "short_label": "REC TOGGLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "263-305",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L305"
     }
    ]
   }
  ],
  "key_gs3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays G#3 (MIDI 56 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "G#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Selects track 2 if it is in use; does nothing for an unused track place.",
    "short_label": "TRACK 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "107-119",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L107-L119"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "286-293",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L286-L293"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Mutes or unmutes track 2 (stays after you let go). Does nothing if that track is not in use.",
    "short_label": "MUTE T2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to G#.",
    "short_label": "ROOT G#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Selects the snare lane and plays it (recorded live when the track is armed and playing).",
    "short_label": "SNARE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "190-192",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L190-L192"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Selects this lane's drum for editing.",
    "short_label": "LANE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters G#3 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER G#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types a space.",
    "short_label": "SPACE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "72-82",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     }
    ]
   }
  ],
  "key_a3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays A3 (MIDI 57 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "A3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "release",
    "action": "Selects pattern 3 of this track (playing: at the loop boundary); the empty-pattern shortcut sets up one recording pass only from an unarmed track, leaving an existing continuous REC arm unchanged.",
    "short_label": "PATTERN 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "263-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L319"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "265-281",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "1033-1040",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "hold",
    "action": "Solos track 3 while held. Does nothing if that track is not in use.",
    "short_label": "SOLO T3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to A.",
    "short_label": "ROOT A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Step 3 of the page shown: toggles the selected lane's hit there (its accent while C#5 is held) and moves the cursor there.",
    "short_label": "STEP 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Step 3 of the page: moves there and adds or removes the selected drum's hit (accented while C#5 is held).",
    "short_label": "STEP 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "888-896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L888-L896"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters A3 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER A3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types EF (tap again within 0.8 s for the next character); in 123 mode types 3.",
    "short_label": "TYPE EF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L29-L31"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "long_press",
    "action": "After 1 s, opens the dialog for pattern 3; releasing the key then does not select it.",
    "short_label": "PAT MENU 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "297-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L297-L319"
     }
    ]
   },
   {
    "mode": "pattern_key_dialog",
    "gesture": "press",
    "action": "If pattern 3 is the dialog’s source, deletes it; otherwise copies the source to pattern 3. During playback, deleting a pattern or copying over a used/playing pattern waits for the track’s loop boundary.",
    "short_label": "TARGET P3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "253-260",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L253-L260"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "321-347",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L321-L347"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "double_press",
    "action": "A second tap within 0.3 s after selecting a used pattern toggles recording for that track.",
    "short_label": "REC TOGGLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "263-305",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L305"
     }
    ]
   }
  ],
  "key_as3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays A#3 (MIDI 58 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "A#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Selects track 3 if it is in use; does nothing for an unused track place.",
    "short_label": "TRACK 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "107-119",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L107-L119"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "286-293",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L286-L293"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Mutes or unmutes track 3 (stays after you let go). Does nothing if that track is not in use.",
    "short_label": "MUTE T3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to A#.",
    "short_label": "ROOT A#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Selects the clap lane and plays it (recorded live when the track is armed and playing).",
    "short_label": "CLAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "190-192",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L190-L192"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Selects this lane's drum for editing.",
    "short_label": "LANE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters A#3 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER A#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cursor right (repeats while held).",
    "short_label": "RIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "72-82",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     }
    ]
   }
  ],
  "key_b3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays B3 (MIDI 59 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "B3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "release",
    "action": "Selects pattern 4 of this track (playing: at the loop boundary); the empty-pattern shortcut sets up one recording pass only from an unarmed track, leaving an existing continuous REC arm unchanged.",
    "short_label": "PATTERN 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "263-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L319"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "265-281",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "1033-1040",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "hold",
    "action": "Solos track 4 while held. Does nothing if that track is not in use.",
    "short_label": "SOLO T4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to B.",
    "short_label": "ROOT B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Step 4 of the page shown: toggles the selected lane's hit there (its accent while C#5 is held) and moves the cursor there.",
    "short_label": "STEP 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Step 4 of the page: moves there and adds or removes the selected drum's hit (accented while C#5 is held).",
    "short_label": "STEP 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "888-896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L888-L896"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters B3 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER B3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types GH (tap again within 0.8 s for the next character); in 123 mode types 4.",
    "short_label": "TYPE GH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L29-L31"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "long_press",
    "action": "After 1 s, opens the dialog for pattern 4; releasing the key then does not select it.",
    "short_label": "PAT MENU 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "297-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L297-L319"
     }
    ]
   },
   {
    "mode": "pattern_key_dialog",
    "gesture": "press",
    "action": "If pattern 4 is the dialog’s source, deletes it; otherwise copies the source to pattern 4. During playback, deleting a pattern or copying over a used/playing pattern waits for the track’s loop boundary.",
    "short_label": "TARGET P4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "253-260",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L253-L260"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "321-347",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L321-L347"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "double_press",
    "action": "A second tap within 0.3 s after selecting a used pattern toggles recording for that track.",
    "short_label": "REC TOGGLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "263-305",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L305"
     }
    ]
   }
  ],
  "key_c4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays C4 (MIDI 60 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "release",
    "action": "Selects pattern 5 of this track (playing: at the loop boundary); the empty-pattern shortcut sets up one recording pass only from an unarmed track, leaving an existing continuous REC arm unchanged.",
    "short_label": "PATTERN 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "263-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L319"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "265-281",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "1033-1040",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Unmutes all four tracks.",
    "short_label": "UNMUTE ALL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to C.",
    "short_label": "ROOT C",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Step 5 of the page shown: toggles the selected lane's hit there (its accent while C#5 is held) and moves the cursor there.",
    "short_label": "STEP 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Step 5 of the page: moves there and adds or removes the selected drum's hit (accented while C#5 is held).",
    "short_label": "STEP 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "888-896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L888-L896"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters C4 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types IJK (tap again within 0.8 s for the next character); in 123 mode types 5.",
    "short_label": "TYPE IJK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L29-L31"
     }
    ]
   },
   {
    "mode": "screen_off",
    "gesture": "press",
    "action": "Any key, button or knob only wakes the screen; that first touch does nothing else.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/screen.c",
      "lines": "49-70",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/screen.c#L49-L70"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "long_press",
    "action": "After 1 s, opens the dialog for pattern 5; releasing the key then does not select it.",
    "short_label": "PAT MENU 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "297-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L297-L319"
     }
    ]
   },
   {
    "mode": "pattern_key_dialog",
    "gesture": "press",
    "action": "If pattern 5 is the dialog’s source, deletes it; otherwise copies the source to pattern 5. During playback, deleting a pattern or copying over a used/playing pattern waits for the track’s loop boundary.",
    "short_label": "TARGET P5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "253-260",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L253-L260"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "321-347",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L321-L347"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "double_press",
    "action": "A second tap within 0.3 s after selecting a used pattern toggles recording for that track.",
    "short_label": "REC TOGGLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "263-305",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L305"
     }
    ]
   }
  ],
  "key_cs4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays C#4 (MIDI 61 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "C#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Selects track 4 if it is in use; does nothing for an unused track place.",
    "short_label": "TRACK 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "107-119",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L107-L119"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "286-293",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L286-L293"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Mutes or unmutes track 4 (stays after you let go). Does nothing if that track is not in use.",
    "short_label": "MUTE T4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to C#.",
    "short_label": "ROOT C#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Selects the closed hat lane and plays it (recorded live when the track is armed and playing).",
    "short_label": "CL HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "190-192",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L190-L192"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Selects this lane's drum for editing.",
    "short_label": "LANE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters C#4 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER C#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Deletes the character before the cursor (repeats while held).",
    "short_label": "DELETE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "72-82",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     }
    ]
   }
  ],
  "key_d4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays D4 (MIDI 62 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "D4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "release",
    "action": "Selects pattern 6 of this track (playing: at the loop boundary); the empty-pattern shortcut sets up one recording pass only from an unarmed track, leaving an existing continuous REC arm unchanged.",
    "short_label": "PATTERN 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "263-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L319"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "265-281",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "1033-1040",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to D.",
    "short_label": "ROOT D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Step 6 of the page shown: toggles the selected lane's hit there (its accent while C#5 is held) and moves the cursor there.",
    "short_label": "STEP 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Step 6 of the page: moves there and adds or removes the selected drum's hit (accented while C#5 is held).",
    "short_label": "STEP 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "888-896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L888-L896"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters D4 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER D4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types LM (tap again within 0.8 s for the next character); in 123 mode types 6.",
    "short_label": "TYPE LM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L29-L31"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "long_press",
    "action": "After 1 s, opens the dialog for pattern 6; releasing the key then does not select it.",
    "short_label": "PAT MENU 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "297-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L297-L319"
     }
    ]
   },
   {
    "mode": "pattern_key_dialog",
    "gesture": "press",
    "action": "If pattern 6 is the dialog’s source, deletes it; otherwise copies the source to pattern 6. During playback, deleting a pattern or copying over a used/playing pattern waits for the track’s loop boundary.",
    "short_label": "TARGET P6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "253-260",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L253-L260"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "321-347",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L321-L347"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "double_press",
    "action": "A second tap within 0.3 s after selecting a used pattern toggles recording for that track.",
    "short_label": "REC TOGGLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "263-305",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L305"
     }
    ]
   }
  ],
  "key_ds4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays D#4 (MIDI 63 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "D#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Silent and unused while SEQ is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "81-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L81-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to D#.",
    "short_label": "ROOT D#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Selects the open hat lane and plays it (recorded live when the track is armed and playing).",
    "short_label": "OP HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "190-192",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L190-L192"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Selects this lane's drum for editing.",
    "short_label": "LANE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters D#4 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER D#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Switches the white keys between letters and digits.",
    "short_label": "ABC/123",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "72-82",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     }
    ]
   }
  ],
  "key_e4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays E4 (MIDI 64 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "E4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "release",
    "action": "Selects pattern 7 of this track (playing: at the loop boundary); the empty-pattern shortcut sets up one recording pass only from an unarmed track, leaving an existing continuous REC arm unchanged.",
    "short_label": "PATTERN 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "263-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L319"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "265-281",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "1033-1040",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to E.",
    "short_label": "ROOT E",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Step 7 of the page shown: toggles the selected lane's hit there (its accent while C#5 is held) and moves the cursor there.",
    "short_label": "STEP 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Step 7 of the page: moves there and adds or removes the selected drum's hit (accented while C#5 is held).",
    "short_label": "STEP 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "888-896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L888-L896"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters E4 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER E4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types NO (tap again within 0.8 s for the next character); in 123 mode types 7.",
    "short_label": "TYPE NO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L29-L31"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "long_press",
    "action": "After 1 s, opens the dialog for pattern 7; releasing the key then does not select it.",
    "short_label": "PAT MENU 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "297-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L297-L319"
     }
    ]
   },
   {
    "mode": "pattern_key_dialog",
    "gesture": "press",
    "action": "If pattern 7 is the dialog’s source, deletes it; otherwise copies the source to pattern 7. During playback, deleting a pattern or copying over a used/playing pattern waits for the track’s loop boundary.",
    "short_label": "TARGET P7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "253-260",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L253-L260"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "321-347",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L321-L347"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "double_press",
    "action": "A second tap within 0.3 s after selecting a used pattern toggles recording for that track.",
    "short_label": "REC TOGGLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "263-305",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L305"
     }
    ]
   }
  ],
  "key_f4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays F4 (MIDI 65 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "F4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "release",
    "action": "Selects pattern 8 of this track (playing: at the loop boundary); the empty-pattern shortcut sets up one recording pass only from an unarmed track, leaving an existing continuous REC arm unchanged.",
    "short_label": "PATTERN 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "263-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L319"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "265-281",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "1033-1040",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Tap tempo: from the third tap the tempo follows the last four taps; a 2 s pause starts over. Internal clock only.",
    "short_label": "TAP TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "206-228",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L206-L228"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to F.",
    "short_label": "ROOT F",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Step 8 of the page shown: toggles the selected lane's hit there (its accent while C#5 is held) and moves the cursor there.",
    "short_label": "STEP 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Step 8 of the page: moves there and adds or removes the selected drum's hit (accented while C#5 is held).",
    "short_label": "STEP 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "888-896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L888-L896"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters F4 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER F4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types PQ (tap again within 0.8 s for the next character); in 123 mode types 8.",
    "short_label": "TYPE PQ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L29-L31"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "long_press",
    "action": "After 1 s, opens the dialog for pattern 8; releasing the key then does not select it.",
    "short_label": "PAT MENU 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "297-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L297-L319"
     }
    ]
   },
   {
    "mode": "pattern_key_dialog",
    "gesture": "press",
    "action": "If pattern 8 is the dialog’s source, deletes it; otherwise copies the source to pattern 8. During playback, deleting a pattern or copying over a used/playing pattern waits for the track’s loop boundary.",
    "short_label": "TARGET P8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "253-260",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L253-L260"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "321-347",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L321-L347"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "double_press",
    "action": "A second tap within 0.3 s after selecting a used pattern toggles recording for that track.",
    "short_label": "REC TOGGLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "263-305",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L263-L305"
     }
    ]
   }
  ],
  "key_fs4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays F#4 (MIDI 66 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "F#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Silent and unused while SEQ is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "81-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L81-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to F#.",
    "short_label": "ROOT F#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Selects the tom lane and plays it (recorded live when the track is armed and playing).",
    "short_label": "TOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "190-192",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L190-L192"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Selects this lane's drum for editing.",
    "short_label": "LANE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters F#4 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER F#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cursor left (repeats while held).",
    "short_label": "LEFT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "72-82",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     }
    ]
   }
  ],
  "key_g4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays G4 (MIDI 67 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "G4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Silent and unused while SEQ is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "81-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L81-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to G.",
    "short_label": "ROOT G",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Step 9 of the page shown: toggles the selected lane's hit there (its accent while C#5 is held) and moves the cursor there.",
    "short_label": "STEP 9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Step 9 of the page: moves there and adds or removes the selected drum's hit (accented while C#5 is held).",
    "short_label": "STEP 9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "888-896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L888-L896"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters G4 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER G4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types RS (tap again within 0.8 s for the next character); in 123 mode types 9.",
    "short_label": "TYPE RS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L29-L31"
     }
    ]
   }
  ],
  "key_gs4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays G#4 (MIDI 68 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "G#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Silent and unused while SEQ is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "81-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L81-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to G#.",
    "short_label": "ROOT G#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Selects the rim lane and plays it (recorded live when the track is armed and playing).",
    "short_label": "RIM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "190-192",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L190-L192"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Selects this lane's drum for editing.",
    "short_label": "LANE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters G#4 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER G#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types a space.",
    "short_label": "SPACE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "72-82",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     }
    ]
   }
  ],
  "key_a4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays A4 (MIDI 69 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "A4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Silent and unused while SEQ is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "81-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L81-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to A.",
    "short_label": "ROOT A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Step 10 of the page shown: toggles the selected lane's hit there (its accent while C#5 is held) and moves the cursor there.",
    "short_label": "STEP 10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Step 10 of the page: moves there and adds or removes the selected drum's hit (accented while C#5 is held).",
    "short_label": "STEP 10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "888-896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L888-L896"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters A4 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER A4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types TU (tap again within 0.8 s for the next character); in 123 mode types 0.",
    "short_label": "TYPE TU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L29-L31"
     }
    ]
   }
  ],
  "key_as4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays A#4 (MIDI 70 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "A#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Silent and unused while SEQ is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "81-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L81-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to A#.",
    "short_label": "ROOT A#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Selects the bell (909: ride) lane and plays it (recorded live when the track is armed and playing).",
    "short_label": "BELL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "190-192",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L190-L192"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Selects this lane's drum for editing.",
    "short_label": "LANE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters A#4 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER A#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cursor right (repeats while held).",
    "short_label": "RIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "72-82",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     }
    ]
   }
  ],
  "key_b4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays B4 (MIDI 71 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "B4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Silent and unused while SEQ is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "81-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L81-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to B.",
    "short_label": "ROOT B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Step 11 of the page shown: toggles the selected lane's hit there (its accent while C#5 is held) and moves the cursor there.",
    "short_label": "STEP 11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Step 11 of the page: moves there and adds or removes the selected drum's hit (accented while C#5 is held).",
    "short_label": "STEP 11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "888-896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L888-L896"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters B4 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER B4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types VW (tap again within 0.8 s for the next character); in 123 mode types -.",
    "short_label": "TYPE VW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L29-L31"
     }
    ]
   }
  ],
  "key_c5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays C5 (MIDI 72 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "C5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Silent and unused while SEQ is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "81-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L81-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to C.",
    "short_label": "ROOT C",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Step 12 of the page shown: toggles the selected lane's hit there (its accent while C#5 is held) and moves the cursor there.",
    "short_label": "STEP 12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Step 12 of the page: moves there and adds or removes the selected drum's hit (accented while C#5 is held).",
    "short_label": "STEP 12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "888-896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L888-L896"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters C5 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER C5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types XYZ (tap again within 0.8 s for the next character); in 123 mode types ..",
    "short_label": "TYPE XYZ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L29-L31"
     }
    ]
   }
  ],
  "key_cs5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays C#5 (MIDI 73 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "C#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Silent and unused while SEQ is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "81-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L81-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to C#.",
    "short_label": "ROOT C#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "hold",
    "action": "Accent mode while held: white keys toggle accents, the LEDs show accents.",
    "short_label": "ACCENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "75-94",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L75-L94"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters C#5 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER C#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Deletes the character before the cursor (repeats while held).",
    "short_label": "DELETE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "72-82",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     }
    ]
   }
  ],
  "key_d5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays D5 (MIDI 74 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "D5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Silent and unused while SEQ is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "81-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L81-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to D.",
    "short_label": "ROOT D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Step 13 of the page shown: toggles the selected lane's hit there (its accent while C#5 is held) and moves the cursor there.",
    "short_label": "STEP 13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Step 13 of the page: moves there and adds or removes the selected drum's hit (accented while C#5 is held).",
    "short_label": "STEP 13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "888-896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L888-L896"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters D5 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER D5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types 123 (tap again within 0.8 s for the next character); in 123 mode types _.",
    "short_label": "TYPE 123",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L29-L31"
     }
    ]
   }
  ],
  "key_ds5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays D#5 (MIDI 75 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "D#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Silent and unused while SEQ is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "81-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L81-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to D#.",
    "short_label": "ROOT D#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Previous 16-step page (patterns longer than 16 steps).",
    "short_label": "PAGE -",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters D#5 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER D#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Switches the white keys between letters and digits.",
    "short_label": "ABC/123",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "72-82",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     }
    ]
   }
  ],
  "key_e5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays E5 (MIDI 76 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "E5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Silent and unused while SEQ is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "81-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L81-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to E.",
    "short_label": "ROOT E",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Step 14 of the page shown: toggles the selected lane's hit there (its accent while C#5 is held) and moves the cursor there.",
    "short_label": "STEP 14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Step 14 of the page: moves there and adds or removes the selected drum's hit (accented while C#5 is held).",
    "short_label": "STEP 14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "888-896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L888-L896"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters E5 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER E5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types 456 (tap again within 0.8 s for the next character); in 123 mode types /.",
    "short_label": "TYPE 456",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L29-L31"
     }
    ]
   }
  ],
  "key_f5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays F5 (MIDI 77 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "F5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Silent and unused while SEQ is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "81-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L81-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to F.",
    "short_label": "ROOT F",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Step 15 of the page shown: toggles the selected lane's hit there (its accent while C#5 is held) and moves the cursor there.",
    "short_label": "STEP 15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Step 15 of the page: moves there and adds or removes the selected drum's hit (accented while C#5 is held).",
    "short_label": "STEP 15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "888-896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L888-L896"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters F5 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER F5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types 789 (tap again within 0.8 s for the next character); in 123 mode types #.",
    "short_label": "TYPE 789",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L29-L31"
     }
    ]
   }
  ],
  "key_fs5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays F#5 (MIDI 78 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "F#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Silent and unused while SEQ is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "81-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L81-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to F#.",
    "short_label": "ROOT F#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Next 16-step page (patterns longer than 16 steps).",
    "short_label": "PAGE +",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters F#5 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER F#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cursor left (repeats while held).",
    "short_label": "LEFT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "72-82",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L72-L82"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     }
    ]
   }
  ],
  "key_g5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Plays G5 (MIDI 79 at octave 0) on the selected track, through the scale's key mode (QNT); on a DRUM track it plays the kit on the General MIDI map.",
    "short_label": "G5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "145-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "129-141",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L129-L141"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "440-445",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L440-L445"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "press",
    "action": "Silent and unused while SEQ is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "81-89",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L81-L89"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "Silent and unused in the GLO layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "724-747",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L724-L747"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press",
    "action": "Sets the selected track's root to G.",
    "short_label": "ROOT G",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "230-263",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L230-L263"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "12-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L12-L20"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "press",
    "action": "Step 16 of the page shown: toggles the selected lane's hit there (its accent while C#5 is held) and moves the cursor there.",
    "short_label": "STEP 16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "67-77",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L67-L77"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "press",
    "action": "Step 16 of the page: moves there and adds or removes the selected drum's hit (accented while C#5 is held).",
    "short_label": "STEP 16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "770-798",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L770-L798"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "888-896",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L888-L896"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "press",
    "action": "Stopped: enters G5 (with any keys held together, up to four) into the cursor step; letting go moves on. Armed and playing: records live.",
    "short_label": "ENTER G5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2374-2385",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2374-L2385"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1545-1565",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1545-L1565"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "1456-1486",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1456-L1486"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types 0-. (tap again within 0.8 s for the next character); in 123 mode types +.",
    "short_label": "TYPE 0-.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L29-L31"
     }
    ]
   }
  ],
  "screen": [
   {
    "mode": "stage",
    "gesture": "shows",
    "action": "A row per track in use shows its sound, role, pattern and steps; the selected row is outlined. The selected track’s notes and waveform sit below (drums show hits). Sound knobs appear for 1.5 s after a turn; armed rows have a red edge that breathes while waiting and pulses during recording.",
    "short_label": "STAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_stage.c",
      "lines": "19-24",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L19-L24"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_stage.c",
      "lines": "62-63",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L62-L63"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_stage.c",
      "lines": "289-301",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L289-L301"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_stage.c",
      "lines": "388-400",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L388-L400"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_stage.c",
      "lines": "440-481",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L440-L481"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_stage.c",
      "lines": "560-588",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L560-L588"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_stage.c",
      "lines": "595-642",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_stage.c#L595-L642"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "shows",
    "action": "Settings: COLOR, FONT, HOLD, LIGHTS, USB AUDIO, USB INPUT, AUDIO CLICK, CLICK LEVEL, COUNT-IN, NOTE PREVIEW, CHORD ENTRY, AUTOSAVE, PICKER POPUPS, KNOB ACCEL, HOME SELECT, GLO SELECT, SCREEN OFF, CALIBRATION, ABOUT, SOUND DESIGNER, BACK.",
    "short_label": "MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_menu.c",
      "lines": "13-24",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_menu.c#L13-L24"
     }
    ]
   },
   {
    "mode": "fx_insert",
    "gesture": "shows",
    "action": "MIX, RATE, character and TONE values above the slot’s effect picture; the effect type is chosen on the rack.",
    "short_label": "FX INSERT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "506-509",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L506-L509"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_pages.c",
      "lines": "622-666",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_pages.c#L622-L666"
     }
    ]
   },
   {
    "mode": "send_fx",
    "gesture": "shows",
    "action": "The shared slot’s MIX, RATE, character and TONE above its effect picture; the footer says All tracks.",
    "short_label": "SEND FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "510-513",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L510-L513"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_pages.c",
      "lines": "249-270",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_pages.c#L249-L270"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_pages.c",
      "lines": "622-666",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_pages.c#L622-L666"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "shows",
    "action": "Envelope values in a strip above its curve; ENV DEST shows destination amounts.",
    "short_label": "ENV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "514-515",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L514-L515"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_pages.c",
      "lines": "4-11",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_pages.c#L4-L11"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_pages.c",
      "lines": "309-341",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_pages.c#L309-L341"
     }
    ]
   },
   {
    "mode": "native_env",
    "gesture": "shows",
    "action": "The engine's own envelope pages (stages, rates, levels).",
    "short_label": "NATIVE ENV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "226-242",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L226-L242"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "shows",
    "action": "LFO values above its wave; LFO 2 and LFO DEST show their own settings.",
    "short_label": "LFO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "516-518",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L516-L518"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_pages.c",
      "lines": "4-11",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_pages.c#L4-L11"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_pages.c",
      "lines": "343-381",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_pages.c#L343-L381"
     }
    ]
   },
   {
    "mode": "mod",
    "gesture": "shows",
    "action": "The four routes as rows (source to destination, amount bar).",
    "short_label": "MOD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "519",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L519"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/design/README.md#L144-L156",
      "path": "docs/design/README.md",
      "lines": "144-156",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "native_lfo",
    "gesture": "shows",
    "action": "The engine's own LFO or vibrato pages.",
    "short_label": "NATIVE LFO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui.c",
      "lines": "226-242",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L226-L242"
     }
    ]
   },
   {
    "mode": "scales",
    "gesture": "shows",
    "action": "The scale list by family with full names and note counts.",
    "short_label": "SCALES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "520",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L520"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L868-L876",
      "path": "README.md",
      "lines": "868-876",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "shows",
    "action": "Rows of settings over an octave with the scale's notes lit.",
    "short_label": "SCL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_list.c",
      "lines": "14-25",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L14-L25"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_list.c",
      "lines": "184-185",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L184-L185"
     }
    ]
   },
   {
    "mode": "chord",
    "gesture": "shows",
    "action": "Chord and voicing over the chord it plays.",
    "short_label": "CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "522",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L522"
     }
    ]
   },
   {
    "mode": "edit",
    "gesture": "shows",
    "action": "Four value cells beneath a header naming the page, with dots for pages in its section and a picture below.",
    "short_label": "EDIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_draw.c",
      "lines": "150-209",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L150-L209"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_pages.c",
      "lines": "887-918",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_pages.c#L887-L918"
     }
    ]
   },
   {
    "mode": "edit_map",
    "gesture": "shows",
    "action": "Sound sections as rows; the selected row opens into page pills, with a dot on the page already open.",
    "short_label": "EDIT MAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_sections.c",
      "lines": "252-275",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_sections.c#L252-L275"
     }
    ]
   },
   {
    "mode": "voice_lists",
    "gesture": "shows",
    "action": "Rows of settings with values at the right.",
    "short_label": "VOICE LISTS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_list.c",
      "lines": "3-10",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L3-L10"
     }
    ]
   },
   {
    "mode": "store",
    "gesture": "shows",
    "action": "Shared U001-U384 user slots, with the chosen slot shown as a larger card and its engine below the name.",
    "short_label": "STORE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/core.h",
      "lines": "66",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/core.h#L66"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "16-32",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L16-L32"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "57-73",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L57-L73"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/upreset.c",
      "lines": "485-492",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/upreset.c#L485-L492"
     }
    ]
   },
   {
    "mode": "cz_tools",
    "gesture": "shows",
    "action": "NAME, 1>2, 2>1 and COMPARE as actions.",
    "short_label": "CZ TOOLS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "564",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L564"
     }
    ]
   },
   {
    "mode": "drum_sound",
    "gesture": "shows",
    "action": "The selected drum’s TUNE, DECAY and character setting (including SNAP for SID kits); DRUM MIX shows LEVEL.",
    "short_label": "DRUM SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "527-528",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L527-L528"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_draw.c",
      "lines": "621-627",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L621-L627"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "shows",
    "action": "Level, pan and mute of the selected track.",
    "short_label": "MIXER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "602",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L602"
     }
    ]
   },
   {
    "mode": "global",
    "gesture": "shows",
    "action": "A4, BUDGET, CLK and TUNE.",
    "short_label": "GLOBAL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "591-592",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L591-L592"
     }
    ]
   },
   {
    "mode": "system",
    "gesture": "shows",
    "action": "MIDI input status, DRUM channel, ROUT, CPU.",
    "short_label": "SYSTEM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "591-592",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L591-L592"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "shows",
    "action": "Shared U001-U384 user slots as a list; the chosen one has a larger card with its engine.",
    "short_label": "USER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/core.h",
      "lines": "66",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/core.h#L66"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "16-32",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L16-L32"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "57-73",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L57-L73"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/upreset.c",
      "lines": "485-492",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/upreset.c#L485-L492"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "shows",
    "action": "Projects A-D, the template, New song; a Boot mark on the one loaded at power-on.",
    "short_label": "PROJECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_slots.c",
      "lines": "3-6",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L3-L6"
     }
    ]
   },
   {
    "mode": "browser",
    "gesture": "shows",
    "action": "The selected sound in a large card with engine and favourite star; neighbours above and below, list name and position at the top.",
    "short_label": "BROWSER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_browser.c",
      "lines": "35-65",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_browser.c#L35-L65"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_browser.c",
      "lines": "68-118",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_browser.c#L68-L118"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "shows",
    "action": "Arpeggiator values in a strip; ARP 2 sits above the notes it plays.",
    "short_label": "ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "596-597",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L596-L597"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_pages.c",
      "lines": "529-568",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_pages.c#L529-L568"
     }
    ]
   },
   {
    "mode": "notes",
    "gesture": "shows",
    "action": "Piano roll with recorded notes at their played timing, the highlighted note outlined, the playhead.",
    "short_label": "NOTES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L617-L620",
      "path": "README.md",
      "lines": "617-620",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "shows",
    "action": "Eight drum lanes across 16 steps, with the selected lane highlighted and a ring around the cursor step.",
    "short_label": "DRUM GRID",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_pages.c",
      "lines": "447-479",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_pages.c#L447-L479"
     }
    ]
   },
   {
    "mode": "pattern",
    "gesture": "shows",
    "action": "LEN, DIV, SWING, GATE over the pattern.",
    "short_label": "PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "599",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L599"
     }
    ]
   },
   {
    "mode": "tempo",
    "gesture": "shows",
    "action": "BPM, SWG and QNT.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "600-601",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L600-L601"
     }
    ]
   },
   {
    "mode": "patterns",
    "gesture": "shows",
    "action": "Rows per track, a cell per pattern (playing, queued, used, empty); the song's sections at the foot.",
    "short_label": "PATTERNS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_patterns.c",
      "lines": "3-19",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_patterns.c#L3-L19"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "shows",
    "action": "Sections as columns of pattern blocks, the jam log, repeats and playhead.",
    "short_label": "SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_patterns.c",
      "lines": "3-19",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_patterns.c#L3-L19"
     }
    ]
   },
   {
    "mode": "motion",
    "gesture": "shows",
    "action": "Motion lanes with a playhead; the selected lane shows the chosen step and its value, with a marker while editing.",
    "short_label": "MOTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_motion.c",
      "lines": "260-319",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_motion.c#L260-L319"
     }
    ]
   },
   {
    "mode": "drum_hit",
    "gesture": "shows",
    "action": "One hit's drum, pitch and length.",
    "short_label": "DRUM HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/params.c",
      "lines": "606",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L606"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "shows",
    "action": "Opens PATTERNS after about 0.7 s.",
    "short_label": "SEQ HELD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2217-2222",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2217-L2222"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "shows",
    "action": "The four levels at the top, a keyboard map of solo, mute, unmute all and tap.",
    "short_label": "LAYER GLO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "393-394",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L393-L394"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "shows",
    "action": "Four nearby scales as full-name rows, with the current scale highlighted; root and chord values above.",
    "short_label": "LAYER SCL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "376-391",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L376-L391"
     }
    ]
   },
   {
    "mode": "sheet",
    "gesture": "shows",
    "action": "A card from the bottom with rows; or a value's full list.",
    "short_label": "SHEET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "3-10",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L3-L10"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "shows",
    "action": "A yes/no question.",
    "short_label": "DIALOG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2170-2183",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2170-L2183"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "shows",
    "action": "The name being typed with the cursor.",
    "short_label": "NAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     }
    ]
   },
   {
    "mode": "new_song",
    "gesture": "shows",
    "action": "KEY shows root, scale and tempo; ROLES has a row for each possible track, including No track.",
    "short_label": "NEW SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_new.c",
      "lines": "179-234",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_new.c#L179-L234"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_new.c",
      "lines": "240-273",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_new.c#L240-L273"
     }
    ]
   },
   {
    "mode": "designer",
    "gesture": "shows",
    "action": "Start screen, then the stages as tabs with the sound pages.",
    "short_label": "DESIGNER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/SOUND_DESIGNER.md#L7-L17",
      "path": "docs/SOUND_DESIGNER.md",
      "lines": "7-17",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/SOUND_DESIGNER.md#L23-L34",
      "path": "docs/SOUND_DESIGNER.md",
      "lines": "23-34",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "shows",
    "action": "HARDWARE CALIBRATION: PRESS <button> or TURN RIGHT <knob>, one at a time.",
    "short_label": "CALIBRATION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "2494-2553",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2494-L2553"
     }
    ]
   },
   {
    "mode": "update_countdown",
    "gesture": "shows",
    "action": "A countdown from 3 to 1, then UBOOT.",
    "short_label": "UPDATE COUNT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/main.c",
      "lines": "268-294",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/main.c#L268-L294"
     }
    ]
   },
   {
    "mode": "screen_off",
    "gesture": "shows",
    "action": "Dark.",
    "short_label": "SCREEN OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/screen.c",
      "lines": "49-70",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/screen.c#L49-L70"
     }
    ]
   },
   {
    "mode": "crash",
    "gesture": "shows",
    "action": "A Melodee crash screen with five fault values in hex, followed by a restart.",
    "short_label": "CRASH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/main.c",
      "lines": "114-139",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/main.c#L114-L139"
     }
    ]
   },
   {
    "mode": "fx_rack",
    "gesture": "shows",
    "action": "Four rows: insert slots 1-3 and Shared, with effect names and amount bars.",
    "short_label": "FX RACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_pages.c",
      "lines": "126-213",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_pages.c#L126-L213"
     }
    ]
   },
   {
    "mode": "shared_fx",
    "gesture": "shows",
    "action": "Rows A-C plus Return, with effect names, amount bars and the ROUTE value above.",
    "short_label": "SHARED FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_pages.c",
      "lines": "126-213",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_pages.c#L126-L213"
     }
    ]
   },
   {
    "mode": "chord_view",
    "gesture": "shows",
    "action": "A note wheel and chord name, track-coloured pitches and pulses, and keys from C2 to B5; the previous voicing fades after release.",
    "short_label": "CHORD VIEW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_view.c",
      "lines": "3-11",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_view.c#L3-L11"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_view.c",
      "lines": "43-74",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_view.c#L43-L74"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_view.c",
      "lines": "145-175",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_view.c#L145-L175"
     }
    ]
   },
   {
    "mode": "pattern_key_dialog",
    "gesture": "shows",
    "action": "The pattern number, Delete and Cancel, and a hint that its own key deletes while another pattern key copies.",
    "short_label": "PATTERN EDIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_draw.c",
      "lines": "953-956",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L953-L956"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_draw.c",
      "lines": "984-1033",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L984-L1033"
     }
    ]
   },
   {
    "mode": "boot_maintenance",
    "gesture": "shows",
    "action": "Startup maintenance progress and power advice; a failure offers Keep or Continue and, for preset work, Wipe followed by a separate confirmation.",
    "short_label": "STARTUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_boot.c",
      "lines": "29-97",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_boot.c#L29-L97"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "action": "WAIT LOOP stays in the header while the selected track is armed and waiting for its pattern start.",
    "short_label": "WAIT LOOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_draw.c",
      "lines": "214-216",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L214-L216"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_draw.c",
      "lines": "264-274",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L264-L274"
     }
    ]
   },
   {
    "mode": "sid_chip",
    "gesture": "shows",
    "action": "MODEL, WAVE, STACK and PW; MODEL includes 6581, 8580 and both C64 versions.",
    "short_label": "SID CHIP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "47",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L47"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_sid.c",
      "lines": "543-554",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_sid.c#L543-L554"
     }
    ]
   },
   {
    "mode": "drum_kit",
    "gesture": "shows",
    "action": "KIT, TUNE, TONE and DECY; KIT offers 808, 909 and SID.",
    "short_label": "DRUM KIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "148",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L148"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "464-475",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L464-L475"
     }
    ]
   },
   {
    "mode": "drum_hit_macros",
    "gesture": "shows",
    "action": "SNAP and ACC; SID kits show DIGI and RES for the last two knobs, other kits KICK and DRV.",
    "short_label": "KIT HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/eng_drum.c",
      "lines": "454-475",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_drum.c#L454-L475"
     }
    ]
   },
   {
    "mode": "shared_fx_sheet",
    "gesture": "shows",
    "action": "Shared FX offers Routing, with its CHAIN or SPLIT value, and Clear shared FX.",
    "short_label": "BUS SHEET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "159-164",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L159-L164"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "352-370",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_popup.c",
      "lines": "321-323",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L321-L323"
     }
    ]
   }
  ],
  "jack_midi_in": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "TRS MIDI receives the chosen four-channel range (1-4, 5-8, 9-12 or 13-16) on the tracks in use; other channels are ignored, while SEL routes all channels to the selected track; the drum-channel override applies inside the range, and TRS can supply clock and transport.",
    "short_label": "MIDI IN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/seq.c",
      "lines": "1109-1125",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1109-L1125"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/midi_clock.c",
      "lines": "1-38",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/midi_clock.c#L1-L38"
     }
    ]
   }
  ],
  "switch_power": [
   {
    "mode": "any",
    "gesture": "power_on_holding:button_oct_down+button_oct_up",
    "action": "Switching on with OCT- and OCT+ held opens HARDWARE CALIBRATION and saves the panel mapping with the settings.",
    "short_label": "CALIBRATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/main.c",
      "lines": "230-233",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/main.c#L230-L233"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/panel.c",
      "lines": "4-9",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/panel.c#L4-L9"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "action": "At power-on Melodee checks settings, repairs or converts preset banks when needed, then loads the BOOT project or template. Keep power connected during startup maintenance. After an early crash it skips the saved music and uses one core next time; a second early failure enters UBOOT.",
    "short_label": "POWER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/main.c",
      "lines": "170-189",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/main.c#L170-L189"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/main.c",
      "lines": "210-214",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/main.c#L210-L214"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/main.c",
      "lines": "349-365",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/main.c#L349-L365"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/project.c",
      "lines": "1101-1118",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L1101-L1118"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/project.c",
      "lines": "1131-1208",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L1131-L1208"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_boot.c",
      "lines": "29-58",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_boot.c#L29-L58"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "power_on_holding:button_oct_down",
    "action": "Power on while holding OCT- alone to request recovery. The boot stub tries the retained Melodee loader; if it is unavailable or recovery already failed once, it enters ROM USB boot (UBOOT). OCT- with OCT+ still opens calibration.",
    "short_label": "RECOVERY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/stub/stub_core.h",
      "lines": "212-230",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/stub/stub_core.h#L212-L230"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/stub/stub_core.h",
      "lines": "249-277",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/stub/stub_core.h#L249-L277"
     }
    ]
   }
  ],
  "jack_usb": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "USB carries MIDI and one duplex Melodee audio device: stereo playback with host volume and mute, and stereo master or four mono track recordings; Settings > USB AUDIO enables either direction and USB INPUT picks the recording layout.",
    "short_label": "USB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/usb.c",
      "lines": "4-21",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/usb.c#L4-L21"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/usb_audio_desc.h",
      "lines": "3-17",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/usb_audio_desc.h#L3-L17"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/usb_audio.c",
      "lines": "215-243",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/usb_audio.c#L215-L243"
     }
    ]
   }
  ]
 },
 "switching_note": {
  "kept_on_unit": "Melodee saves four projects (A-D, eight patterns per track), a template, 384 shared user presets (U001-U384), favourites and device settings. A shared slot holds any engine, including complete FM6, CZ-1 or Prophet voice data. The first start converts supported preceding preset banks and may move their slot numbers. Supported projects and templates also convert. Unsupported preset banks or entries are cleared at startup; incompatible projects remain OLD FORMAT. Current packages use both cores. From the flash atlas (generated): install (loader): App range remains 0x4000-0x92FFF. For packages containing CRSTUB/valid CRBM commit metadata: before any changed body sector, erase marker sector 0x91000; update differing stub/directory sector 0x4000 first, remaining body sectors next, marker sector last. Marker at 0x91FE0 holds CRBM magic, format 1, body length, body CRC and marker CRC. Unmarked legacy packages retain ascending write order; damaged marked packages are rejected before erase. No flash-head or musical-data relocation (For a marked CRSTUB/CRBM package, invalidate marker before differing body writes and commit marker last; legacy unmarked packages use ascending order; damaged marked package refused before erase). install (loader): After the host confirms success the loader clears the RAM update record and scans every sector from 0xFB000 down to 0x93000: a sector whose last 256 bytes start with a valid update record (bytes 6-7 = 0x5441 and a matching CRC-16) is ERASED whole. This removes Melodee's own staging record sector 0xE4000 and any other firmware's update record in that range (the stock firmware's is reported at 0xE8F00 by the Felucca map, not checked here) (Only sectors in 0x93000-0xFBFFF whose last 256 bytes hold a valid update record are erased. Current compact UPB2 banks and project extension tails stay erased; project base sectors remain within the scan. Settings at0xFC000/0xFD000 are outside this loader scan). update: When an update is started from a running Melodee: erase 0xE0000-0xE4FFF, write the package's loader from 0xE0020, verify it, write a LOADER.BIN head at 0xE0000, wait for the host's success, then write the update record at 0xE4F00 and reset. Any failure erases the area again. Melodee stages its own family's loader (marked FELUCCA-LOADER-1) or the official M-VAVE loader; the official one only if the package's flash head 0x0000-0x3FFF equals the unit's, and that loader rewrites the whole flash.bin including the head (the code's own comment) (an M-UPGRADE session from the installer or the web installer's Return to V15). every start-up: At startup ota_staged checks the loader outer/inner headers and CRCs, own identity marker, compressed-block lengths and total decompressed-length accounting. It does not decompress or validate the compressed body contents. Structurally accepted own staging is retained: if it ends before the final sector, only dirty record sector 0xE4000 is erased; if it extends into that sector, all is retained. Staging that fails these structural checks is scanned and all five sectors are erased when any byte is used. Cleanup does not run after an earlier boot maintenance error (With flash_ok and no earlier boot maintenance error: retain structurally accepted own loader staging, even if corruption inside an unchecked compressed body remains; otherwise erase dirty staging). first start-up after another firmware: Read supported legacy preset banks, convert UPB1/FM6/CZ/P5 into shared UPB2 in existing A/B objects. FM6 sidecars are embedded before source conversion. Old Prophet slots 18-25 spill into the two extra positions of former 16-slot banks, then new bank21. Only needed valid-used spill records write a destination. Missing matching bank alone does not write. Same-object FELU record with unsupported bank shape, or invalid used records inside a readable bank, causes RESETTING PRESETS and immediate A/B bank save, no question. Valid entries are preserved; unreadable entries are discarded. Foreign header mismatches have no matching commit and remain empty/unwritten. Explicit separate confirmation from a preset error writes WIPE-PENDING in bank21 then empties every preset object twice. A later boot with the marker resumes this wipe automatically (Only matching committed bank repair/conversion or required legacy Prophet spill; absent/mismatched headers by themselves are untouched. Interrupted confirmed wipe resumes). every start-up: At boot missing/foreign/invalid settings are reset, or supported legacy settings ownership/normalization saved, immediately without a question. OVERCLOCK fault saves have been removed (when defaults, ownership or normalization differ; unknown owned schemas/templates protected). every start-up: Holding OCT- and OCT+ at power-on runs the panel calibration and saves the settings (only when both buttons are held at power-on (an owner action)). every start-up: A loaded supported older Melodee BOOT project (FUN16-FUN21, standalone or nested in FBKK) can be repacked to FUN22 by default-on autosave after 5 seconds stopped and untouched, only if packed bytes differ. Same base/extension address pairs. Projects remain OLD FORMAT protected when no supported parser succeeds; they are not part of preset startup repair (A supported older BOOT project loads, default-on autosave is enabled, transport stops and packed bytes differ after five seconds untouched). update: The host recovery tool (for a unit in UBOOT) first reads the whole flash into a backup file, then writes only program sectors 0x4000-0x92FFF that differ, refusing any other address. 1.3.2's tool also accepts the unmodified official V15 FM-1.fwsc (pinned SHA-256); the same range applies (run by the owner with --write). update: Back up and return to official V15 still verifies the package, captures complete editor archive unless Skip backup is selected, asks confirmation, and installs using the official loader (same flash-head requirement). Backup capability detection now accepts 1.4 archive support independently of motion/UI versions. Rescue-loader resume requires prior-backup or skip acknowledgement. Current archive has 29 IDs, including new shared tail bank. Official V15 subsequent data writes remain unverified by this source (owner action; refuses an unverified package; from the update loader (no running Melodee) it needs the 'already backed up' or 'skip backup' box). What Melodee writes over the previous firmware's data is in overwrites_previous; what the next firmware writes over Melodee's is in when_you_leave.",
  "lost": "The supplied v1.3.2 cannot read v1.4.1 shared preset banks, FUN22 projects or the TPLL template; keep a backup made before updating. Project autosave and the first startup template conversion can make these incompatible without an explicit save. In v1.3.2 the projects show OLD FORMAT and remain protected, and the unreadable template is protected too. Startup replaces foreign or invalid settings and unsupported matching-object preset banks without asking. Early Prophet banks at 0x89000 are still outside migration and ordinary backups. The stock V15 program cannot use Melodee projects; what V15 later overwrites is not confirmed by this source. From the flash atlas (generated): No other firmware reads Melodee's data, and Melodee reads none of theirs.",
  "back_up_first": "Before updating, save a complete backup with the firmware currently on the unit. In 1.4.1 the editor archive has 29 object IDs: current music, settings and template, projects A-D, 22 shared preset banks, and an empty retired-bank placeholder. Its filename begins Melodee-backup; its JSON format name remains felucca-backup. Restore it with Melodee's editor. The archive omits retired Prophet data at 0x89000 and undo history. It preserves raw committed bytes for export, but restore still validates supported content. Restore writes objects separately, so a failure can leave a partial restore. In this source a settings backup with a nondefault device VOICE BUDGET fails the restore settings check. Native FM6, CZ-1 and Prophet sounds can also export as .syx. The installer can back up before returning to official V15, unless Skip backup is chosen. The recovery tool saves a complete flash image to disk before writing; that image also retains the retired 0x89000 area. Restoring an older 28-object archive first clears the current U379-U384 bank, before any archived objects are written, although that archive contains no copy of those six slots. Legacy Prophet conversion can later fill them with spill sounds; it does not keep their current contents. Back up the current library before restoring an older archive.",
  "dual_core": "Current stable, release-candidate and nightly packages use both CPU cores; the installer no longer offers Single core. Work sent to the second core carries a check word. A bad read, fault or stall retires that worker, and a retained RAM flag keeps it off across restarts until power-off. An early crash also makes the next start use one core and skip the BOOT project or template; a second early failure enters UBOOT. Melodee no longer retunes the clock or offers OVERCLOCK. A 320 MHz clock left by an older session lasts until power-off.",
  "source": [
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/settings_persist.c",
    "lines": "32-60",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/settings_persist.c#L32-L60"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/settings_persist.c",
    "lines": "104-133",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/settings_persist.c#L104-L133"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "1131-1208",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L1131-L1208"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/upreset.c",
    "lines": "101-136",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/upreset.c#L101-L136"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/shared_presets.c",
    "lines": "113-151",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/shared_presets.c#L113-L151"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/shared_presets.c",
    "lines": "205-309",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/shared_presets.c#L205-L309"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/editor_backup.c",
    "lines": "12-14",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L12-L14"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/editor_backup.c",
    "lines": "39-86",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L39-L86"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/editor_backup.c",
    "lines": "138-212",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L138-L212"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "web/fm1backup.js",
    "lines": "68-113",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/fm1backup.js#L68-L113"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "web/fm1backup.js",
    "lines": "115-156",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/fm1backup.js#L115-L156"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "web/editor.html",
    "lines": "3848-3867",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/editor.html#L3848-L3867"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "web/index_pkg.html",
    "lines": "317-346",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/index_pkg.html#L317-L346"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "tools/fm1_recover.py",
    "lines": "271-302",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/tools/fm1_recover.py#L271-L302"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/sysex_library.c",
    "lines": "74-88",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/sysex_library.c#L74-L88"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "296-384",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L296-L384"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "800-904",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L800-L904"
   },
   {
    "kind": "doc",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "README.md",
    "lines": "783-789",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L783-L789"
   },
   {
    "kind": "doc",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "BUILDING.md",
    "lines": "568-580",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/BUILDING.md#L568-L580"
   },
   {
    "kind": "doc",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "docs/STORAGE_PLAN.md",
    "lines": "287-294",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/STORAGE_PLAN.md#L287-L294"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/audio_worker.h",
    "lines": "54-99",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/audio_worker.h#L54-L99"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/hal/fm1_core1_bar.h",
    "lines": "6-21",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/hal/fm1_core1_bar.h#L6-L21"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/main.c",
    "lines": "98-105",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/main.c#L98-L105"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/main.c",
    "lines": "210-214",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/main.c#L210-L214"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/main.c",
    "lines": "349-365",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/main.c#L349-L365"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/hal/fm1_clock.h",
    "lines": "1-12",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/hal/fm1_clock.h#L1-L12"
   },
   {
    "kind": "doc",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "BUILDING.md",
    "lines": "568-580",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/BUILDING.md#L568-L580"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "web/fm1backup.js",
    "lines": "146-156",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/fm1backup.js#L146-L156"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/editor_backup.c",
    "lines": "39-45",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L39-L45"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/editor_backup.c",
    "lines": "179-186",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L179-L186"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/upreset.c",
    "lines": "106-113",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/upreset.c#L106-L113"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/storage.c",
    "lines": "67-70",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/storage.c#L67-L70"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/shared_presets.c",
    "lines": "282-298",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/shared_presets.c#L282-L298"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "18-27",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L18-L27"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/pattern_store.c",
    "lines": "42-47",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/pattern_store.c#L42-L47"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "485-516",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L485-L516"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "561-579",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L561-L579"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/ui_input.c",
    "lines": "703-727",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "610-624",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L624"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "801-815",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L801-L815"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "846-865",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L846-L865"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "890-904",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L890-L904"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "1146-1188",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L1146-L1188"
   }
  ],
  "going_back": "The supplied v1.3.2 cannot read the shared preset banks, FUN22 projects or TPLL template written by v1.4.1. A loaded older project can be rewritten as FUN22 after 5 seconds stopped and idle with autosave on, even without an edit. Normal first startup converts a supported v1.3.x template to TPLL during the settings ownership/normalization write. Back up with the previous firmware before updating if you may return. In v1.3.2 these projects show OLD FORMAT and are protected; its unreadable template is also protected. Compatibility with v1.4.0 was not checked. Slot numbers can move during preset conversion. This source still ignores retired Prophet banks at 0x89000. The web installer can return to verified official V15 after an optional complete backup; the ROM recovery tool also accepts the pinned V15 package and saves a full flash image before writing. V15's later writes to musical data are not confirmed here.",
  "overwrites_previous": [
   {
    "from": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "stock settings (and possibly patterns)",
     "stock Bluetooth data",
     "stock voices (128 user patches, banks A-D)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): stock settings (and possibly patterns); stock Bluetooth data; stock voices (128 user patches, banks A-D).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "baudgirl",
    "name": "Baud Girl FM-1+VA",
    "flags": "?",
    "weakest_grade": "inferred",
    "at_risk": [],
    "possibly_at_risk": [
     "Baud Girl presets (128)",
     "Baud Girl patterns (16, with locks)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): Baud Girl presets (128); Baud Girl patterns (16, with locks).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "felucca",
    "name": "Felucca",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 patches of the FM6 user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its preset bank]",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user presets 1-16",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user presets 17-32",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, button calibration, favourites, MIDI LEARN map",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot A",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot B",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot C",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot D",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore an older 28-object Melodee backup (clears U379-U384 first) (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the autosave (the music as you left it)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 voice bank B1-B32",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FM6 patches of the FM6 user presets; user presets 1-16; user presets 17-32; settings, button calibration, favourites, MIDI LEARN map. At risk by itself, under a condition: project slot A; project slot B; project slot C; project slot D; user sample slot USR3; the autosave (the music as you left it); FM6 voice bank B1-B32. At risk when you act: user sample slot USR1; user sample slot USR2.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloop",
    "name": "SLOOP",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the music in progress (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore an older 28-object Melodee backup (clears U379-U384 first) (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3 (header at 0xC8000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patch bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR4 (header at 0xE7000)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1 (header at 0xA0000)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2 (header at 0xB4000)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: the music in progress (autosave); user sounds U01-U16; user sounds U17-U32; settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk by itself, under a condition: song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project); user sample slot USR3 (header at 0xC8000); FM6 patch bank B1-B27; user sample slot USR4 (header at 0xE7000). At risk when you act: user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "x0x",
    "name": "X0X",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the whole X0X project (settings, sound, all 32 patterns, song, knob motion)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore an older 28-object Melodee backup (clears U379-U384 first) (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "break loops slot 3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "X0X button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "break loops slot 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "break loops slot 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: the whole X0X project (settings, sound, all 32 patterns, song, knob motion). At risk by itself, under a condition: break loops slot 3; X0X button calibration. At risk when you act: break loops slot 1; break loops slot 2.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "jiant",
    "name": "JIANT",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 patches of the FM6 user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its preset bank]",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration, favourites, MENU options",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore an older 28-object Melodee backup (clears U379-U384 first) (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 7: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 8: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "which song is current, every song's rows and scenes",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the music in progress (RESTORE LAST)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 voice bank B1-B32",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 2: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 3: four sections (whole projects)",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "song 4: four sections (whole projects)",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "song 5: four sections (whole projects)",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "song 6: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FM6 patches of the FM6 user sounds; user sounds U01-U16; user sounds U17-U32; settings, calibration, favourites, MENU options. At risk by itself, under a condition: 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); song 7: four sections (whole projects); song 8: four sections (whole projects); which song is current, every song's rows and scenes; the music in progress (RESTORE LAST); FM6 voice bank B1-B32. At risk when you act: song 2: four sections (whole projects); song 3: four sections (whole projects) (some of it lost); song 4: four sections (whole projects) (some of it lost); song 5: four sections (whole projects) (some of it lost); song 6: four sections (whole projects).",
    "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": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FoMni button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). At risk by itself, under a condition: FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "amb",
    "name": "AMB-1",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "AMB-1 panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: AMB-1 pieces and setup. At risk by itself, under a condition: AMB-1 panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "choralroot",
    "name": "ChoralRoot",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "32 imported DX7 voices",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "options, playing setup and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 4",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 5",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 6",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 7",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 8",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 9",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 10",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank A (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank B (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank C (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank D (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank E (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank F (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank G (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank H (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last global-save session",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "favourite marks, chord/bass type and filter",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "128 saved sounds with their complete engine patches",
      "effect": "some or all of it lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "some or all of it lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: 32 imported DX7 voices; options, playing setup and panel calibration. At risk by itself, under a condition: 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. At risk when you act: CZ-1 bank A (16 tones); CZ-1 bank B (16 tones); CZ-1 bank C (16 tones); CZ-1 bank D (16 tones); CZ-1 bank E (16 tones); CZ-1 bank F (16 tones); CZ-1 bank G (16 tones); CZ-1 bank H (16 tones); last global-save session; favourite marks, chord/bass type and filter; 128 saved sounds with their complete engine patches (some or all of it lost).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "ghoulbox",
    "name": "GHOULBOX",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 patches for user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its preset bank]",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore an older 28-object Melodee backup (clears U379-U384 first) (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "music in progress (RESTORE LAST)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 voice bank B1–B32",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FM6 patches for user sounds; user sounds 1–16; user sounds 17–32; settings and panel calibration. At risk by itself, under a condition: project A; project B; project C; project D; user sample slot USR3; music in progress (RESTORE LAST); FM6 voice bank B1–B32. At risk when you act: user sample slot USR1; user sample slot USR2.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Open shared sample audio",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore an older 28-object Melodee backup (clears U379-U384 first) (no question; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Open USER project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open device preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Melodee (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Installing this firmware replaces Open’s sixteen USER projects, preferences and sample header before its first start, including the first 24 KiB of sample storage. This follows Open’s source-defined USER layout and the incoming program range; export projects and device samples before leaving Open."
    ],
    "owner_text": "At risk by itself: Open shared sample audio. At risk when you act: Open USER project 1; Open USER project 2; Open USER project 3; Open USER project 4; Open USER project 5; Open USER project 6; Open USER project 7; Open USER project 8; Open USER project 9; Open USER project 10; Open USER project 11; Open USER project 12; Open USER project 13; Open USER project 14; Open USER project 15; Open USER project 16; Open device preferences. Installing this firmware replaces Open’s sixteen USER projects, preferences and sample header before its first start, including the first 24 KiB of sample storage. This follows Open’s source-defined USER layout and the incoming program range; export projects and device samples before leaving Open.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm106",
    "name": "FM-106",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "octave, last selected preset and MIDI preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older stored user bank, if present (Beta4 does not store new edits)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls."
    ],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences. At risk by itself, under a condition: older stored user bank, if present (Beta4 does not store new edits). A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "hortator",
    "name": "Hortator",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore an older 28-object Melodee backup (clears U379-U384 first) (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings and panel calibration. At risk by itself, under a condition: project A; project B; project C; project D; user samples USR3. At risk when you act: user samples USR1; user samples USR2.",
    "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": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting in the menu (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send data from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting in the menu (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send data from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting in the menu (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send data from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 4",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting in the menu (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send data from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 5",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting in the menu (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send data from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 6",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting in the menu (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send data from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 7",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting in the menu (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a template (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "pattern 8",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting in the menu (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a template (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send data from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: 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); saved programs and global settings; pattern 8 (its B-track sound can change if it uses a saved program; its pattern notes remain).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "polly",
    "name": "Polly",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Polly setup and channel sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Optional QY70 style bank",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "All four Polly songs",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore an older 28-object Melodee backup (clears U379-U384 first) (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 4",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Polly setup and channel sounds. At risk by itself, under a condition: Optional QY70 style bank; All four Polly songs; Polly shared memory 1; Polly shared memory 2; Polly shared memory 3; Polly shared memory 4; Polly button and encoder calibration. At risk when you act: Polly shared memory 5; Polly shared memory 6; Polly shared memory 7; Polly shared memory 8; Polly shared memory 9; Polly shared memory 10; Polly shared memory 11; Polly shared memory 12; Polly shared memory 13; Polly shared memory 14; Polly shared memory 15; Polly shared memory 16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "skiff",
    "name": "Skiff",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "user sound bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sound bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space [through its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you quick-save a project (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you save a project from the web editor (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you quick-save a project (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you save a project from the web editor (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you quick-save a project (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you save a project from the web editor (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you quick-save a project (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore an older 28-object Melodee backup (clears U379-U384 first) (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you save a project from the web editor (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds’ own FM6 patches",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last session",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you quick-save a project (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you save a project from the web editor (no question) [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared 64-pattern pool",
      "effect": "some or all of it lost",
      "ways": [
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "some or all of it lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "some or all of it lost"
       }
      ]
     },
     {
      "object": "user sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: user sound bank 1; user sound bank 2; settings, calibration and favourites. At risk by itself, under a condition: project A; project B; project C; project D; user sounds’ own FM6 patches; user sample USR3; last session; shared 64-pattern pool (some or all of it lost). At risk when you act: user sample USR1; user sample USR2.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ],
  "overwrites_previous_grade": "Generated from the flash atlas (output/fm1/flash-atlas/). Each fact carries its evidence grade. Available firmware source was read at the mapped release; Open’s USER layout is read in its package and APP source; its native SDK/loader are closed. Stock V15’s layout is reported from V13 analysis; Baud Girl’s is inferred. Nothing was tested on a unit. Anything listed is at risk, whatever saved copy might survive.",
  "going_back_source": [
   {
    "kind": "doc",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "README.md",
    "lines": "783-789",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L783-L789"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/storage.c",
    "lines": "25-34",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/storage.c#L25-L34"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "web/index_pkg.html",
    "lines": "317-346",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/index_pkg.html#L317-L346"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "tools/fm1_recover.py",
    "lines": "64-72",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/tools/fm1_recover.py#L64-L72"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "tools/fm1_recover.py",
    "lines": "271-302",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/tools/fm1_recover.py#L271-L302"
   },
   {
    "kind": "doc",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "docs/STORAGE_PLAN.md",
    "lines": "287-294",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/STORAGE_PLAN.md#L287-L294"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "18-27",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L18-L27"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/pattern_store.c",
    "lines": "42-47",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/pattern_store.c#L42-L47"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "485-516",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L485-L516"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "561-579",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L561-L579"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/ui_input.c",
    "lines": "703-727",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "610-624",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L624"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "801-815",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L801-L815"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "846-865",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L846-L865"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "890-904",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L890-L904"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "1146-1188",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L1146-L1188"
   }
  ],
  "when_you_leave": [
   {
    "to": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "shared user presets U289-U378",
     "shared user presets U379-U384",
     "shared user presets U109-U126",
     "project A: patterns, song, sounds, motion, recordings",
     "project B: patterns, song, sounds, motion, recordings",
     "project C: patterns, song, sounds, motion, recordings",
     "project D: patterns, song, sounds, motion, recordings",
     "shared user presets U145-U288",
     "shared user presets U073-U090",
     "shared user presets U091-U108",
     "shared user presets U001-U018",
     "shared user presets U019-U036",
     "shared user presets U037-U054",
     "shared user presets U055-U072",
     "shared user presets U127-U144"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): shared user presets U289-U378; shared user presets U379-U384; shared user presets U109-U126; project A: patterns, song, sounds, motion, recordings; project B: patterns, song, sounds, motion, recordings; project C: patterns, song, sounds, motion, recordings; project D: patterns, song, sounds, motion, recordings; shared user presets U145-U288; shared user presets U073-U090; shared user presets U091-U108; shared user presets U001-U018; shared user presets U019-U036; shared user presets U037-U054; shared user presets U055-U072; shared user presets U127-U144.",
    "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": [
     "shared user presets U289-U378",
     "shared user presets U379-U384",
     "shared user presets U109-U126",
     "project A: patterns, song, sounds, motion, recordings",
     "project B: patterns, song, sounds, motion, recordings",
     "project C: patterns, song, sounds, motion, recordings",
     "project D: patterns, song, sounds, motion, recordings",
     "shared user presets U145-U288",
     "shared user presets U073-U090",
     "shared user presets U091-U108",
     "shared user presets U001-U018",
     "shared user presets U019-U036",
     "shared user presets U037-U054",
     "shared user presets U055-U072",
     "shared user presets U127-U144"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): shared user presets U289-U378; shared user presets U379-U384; shared user presets U109-U126; project A: patterns, song, sounds, motion, recordings; project B: patterns, song, sounds, motion, recordings; project C: patterns, song, sounds, motion, recordings; project D: patterns, song, sounds, motion, recordings; shared user presets U145-U288; shared user presets U073-U090; shared user presets U091-U108; shared user presets U001-U018; shared user presets U019-U036; shared user presets U037-U054; shared user presets U055-U072; shared user presets U127-U144.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "felucca",
    "name": "Felucca",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared user presets U037-U054",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it (its RESTORE LAST is on by default)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if its 2ND CORE is on and a render job fails or times out",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you learn MIDI CCs (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U055-U072",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if an earlier Felucca or GHOULBOX voice-bank upload survives and the saved bank is missing or older",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U289-U378",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project from the web editor",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "shared user presets U379-U384",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U109-U126",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U145-U288",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U073-U090",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U091-U108",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U019-U036",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: shared user presets U037-U054; settings, factory favourites, calibration, saved template. At risk by itself, under a condition: shared user presets U055-U072. At risk when you act: shared user presets U289-U378 (some of it lost); shared user presets U379-U384; shared user presets U109-U126; project A: patterns, song, sounds, motion, recordings; project B: patterns, song, sounds, motion, recordings; project C: patterns, song, sounds, motion, recordings; 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.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "sloop",
    "name": "SLOOP",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared user presets U109-U126",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start an update (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store drum kits from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U289-U378",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "shared user presets U379-U384",
      "effect": "lost",
      "ways": [
       {
        "way": "when you load a song file or a LIVE playlist song (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you store a section from the web editor LIVE page (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U145-U288",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U073-U090",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U091-U108",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U019-U036",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U037-U054",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U055-U072",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U127-U144",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: shared user presets U109-U126; settings, factory favourites, calibration, saved template. At risk when you act: shared user presets U289-U378 (some of it lost); shared user presets U379-U384; project A: patterns, song, sounds, motion, recordings; project B: 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 U037-U054; shared user presets U055-U072; shared user presets U127-U144.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "x0x",
    "name": "X0X",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared user presets U289-U378",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "some of it lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "shared user presets U379-U384",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U019-U036",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only after a retained second-core failure, if two cores were enabled",
        "effect": "lost"
       },
       {
        "way": "when you back up pending project edits over USB (no question)",
        "effect": "lost"
       },
       {
        "way": "when you do a factory reset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U145-U288",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U073-U090",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U091-U108",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: shared user presets U289-U378 (some of it lost); shared user presets U379-U384; shared user presets U019-U036; settings, factory favourites, calibration, saved template. At risk when you act: project A: patterns, song, sounds, motion, recordings; project B: 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.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "jiant",
    "name": "JIANT",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared user presets U073-U090",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you select a song through MIDI PROGRAM CHANGE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you switch song or project (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change settings from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U037-U054",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if its RESTORE LAST is on",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U055-U072",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if it ran on this unit before and its staged voice bank survived",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U289-U378",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "shared user presets U379-U384",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U109-U126",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U145-U288",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "when you make a multi-section song with GEN (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project from the web editor (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U019-U036",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: shared user presets U073-U090; settings, factory favourites, calibration, saved template. At risk by itself, under a condition: shared user presets U037-U054; shared user presets U055-U072. At risk when you act: shared user presets U289-U378 (some of it lost); shared user presets U379-U384; shared user presets U109-U126; project A: patterns, song, sounds, motion, recordings; project B: patterns, song, sounds, motion, recordings; project C: patterns, song, sounds, motion, recordings; project D: patterns, song, sounds, motion, recordings; shared user presets U145-U288 (some of it lost); shared user presets U001-U018; shared user presets U019-U036.",
    "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": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, factory favourites, calibration, saved template. At risk when you act: shared user presets U001-U018.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "amb",
    "name": "AMB-1",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, factory favourites, calibration, saved template. At risk when you act: shared user presets U001-U018.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "choralroot",
    "name": "ChoralRoot",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "project C: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if a save or failed boot preparation leaves its next spare unprepared",
        "effect": "lost"
       },
       {
        "way": "by itself, only if an older ChoralRoot favourites save survives and its next spare is not blank",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if an older ChoralRoot session save survives and its next spare is not blank",
        "effect": "lost"
       },
       {
        "way": "by itself, only if an older ChoralRoot sound-pool save survives and its next spare is not blank",
        "effect": "lost"
       },
       {
        "way": "by itself, only if no pool bank exists and at least one legacy UPB1/192 sound passes validation",
        "effect": "lost"
       },
       {
        "way": "when you choose Overwrite or Save as new and accept with OCT+ or SAVE (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm deletion/reset with OCT+ (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you hold OCT- and OCT+ while switching on (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you hold SAVE for a global save (no question)",
        "effect": "lost"
       },
       {
        "way": "when you keep calibration or enter update with OCT- + OCT+ + HOME held for 5 s (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request Import 0.21 sounds from the device manager (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore favourites from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore pool banks 50..62, or accepted legacy sound objects that are redirected into pool slots 1..32 from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore settings, which also writes an empty session record from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U145-U288",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you hold SAVE after recording/editing/clearing this loop (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you press REC in Advance mode with a nonempty current loop (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you restore loop id 40; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you restore loop id 41; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you restore loop id 42; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you restore loop id 43; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you restore loop id 44; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you restore loop id 45; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you restore loop id 46; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you restore loop id 47; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "shared user presets U073-U090",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE after recording/editing/clearing this loop (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press REC in Advance mode with a nonempty current loop (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore loop id 48; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U091-U108",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE after recording/editing/clearing this loop (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press REC in Advance mode with a nonempty current loop (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore loop id 49; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if core failure barred Dual Core while the stored setting was On",
        "effect": "lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (no question)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE for a global save (no question)",
        "effect": "lost"
       },
       {
        "way": "when you keep calibration or enter update with OCT- + OCT+ + HOME held for 5 s (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore settings from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a save or failed boot preparation leaves its next spare unprepared",
        "effect": "lost"
       },
       {
        "way": "by itself, only if an older ChoralRoot sound-pool save survives and its next spare is not blank",
        "effect": "lost"
       },
       {
        "way": "when you choose Overwrite or Save as new and accept with OCT+ or SAVE (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm deletion/reset with OCT+ (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you request Import 0.21 sounds from the device manager (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore pool banks 50..62, or accepted legacy sound objects that are redirected into pool slots 1..32 from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U289-U378",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "shared user presets U379-U384",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U109-U126",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore FM6 bank id 8 from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a DX7 bank dump (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank A (id 14) from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore CZ bank B (id 15) from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank C (id 16) from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore CZ bank D (id 17) from backup software (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "project B: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank E (id 18) from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank F (id 19) from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore CZ bank G (id 20) from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore CZ bank H (id 21) from backup software (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U019-U036",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: project C: patterns, song, sounds, motion, recordings; shared user presets U145-U288 (some of it lost); shared user presets U073-U090; shared user presets U091-U108; settings, factory favourites, calibration, saved template. At risk by itself, under a condition: project D: patterns, song, sounds, motion, recordings. At risk when you act: shared user presets U289-U378 (some of it lost); shared user presets U379-U384; shared user presets U109-U126; project A: patterns, song, sounds, motion, recordings; project B: patterns, song, sounds, motion, recordings; shared user presets U001-U018; shared user presets U019-U036.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "ghoulbox",
    "name": "GHOULBOX",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared user presets U037-U054",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it (its RESTORE LAST is on by default)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send settings from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U109-U126",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if no valid UPF6 exists and a valid old type-7 FM6B bank survives",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user patch",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U055-U072",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a compatible staged bank survives and is newer than home, or home is invalid",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U289-U378",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "shared user presets U379-U384",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U145-U288",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U073-U090",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U091-U108",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U019-U036",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: shared user presets U037-U054; settings, factory favourites, calibration, saved template. At risk by itself, under a condition: shared user presets U109-U126; shared user presets U055-U072. At risk when you act: shared user presets U289-U378 (some of it lost); shared user presets U379-U384; project A: patterns, song, sounds, motion, recordings; project B: 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.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared user presets U289-U378",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U379-U384",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U109-U126",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U145-U288",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U073-U090",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U091-U108",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U019-U036",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U037-U054",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U055-U072",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U127-U144",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "The factory-sample write runs by itself right after the Workbench installs Open, before any project save. The source-built V12 bank erases 0x8D000–0x9FFFF without another sample question. The shipped Workbench asset was not compared with the source."
    ],
    "owner_text": "At risk by itself: shared user presets U289-U378; shared user presets U379-U384; shared user presets U109-U126. At risk when you act: project A: patterns, song, sounds, motion, recordings; project B: 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 U037-U054; shared user presets U055-U072; shared user presets U127-U144; settings, factory favourites, calibration, saved template. The factory-sample write runs by itself right after the Workbench installs Open, before any project save. The source-built V12 bank erases 0x8D000–0x9FFFF without another sample question. The shipped Workbench asset was not compared with the source.",
    "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": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm deletion of the active user slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE in the save screen (no question)",
        "effect": "lost"
       },
       {
        "way": "when you release a short SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, factory favourites, calibration, saved template.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "hortator",
    "name": "Hortator",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (no question)",
        "effect": "lost"
       },
       {
        "way": "when you remember or forget a Bluetooth device (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U289-U378",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "shared user presets U379-U384",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, factory favourites, calibration, saved template. At risk when you act: shared user presets U289-U378 (some of it lost); shared user presets U379-U384.",
    "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": "project C: patterns, song, sounds, motion, recordings",
      "effect": "damaged (part of it written over)",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 1 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 2 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you tap SAVE in the sequencer (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "project D: patterns, song, sounds, motion, recordings",
      "effect": "damaged (part of it written over)",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 3 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 4 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 5 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 6 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you tap SAVE in the sequencer (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "shared user presets U127-U144",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you request a copy into pattern 7 (no question)",
        "effect": "lost"
       },
       {
        "way": "when you tap SAVE in the sequencer (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you tap SAVE twice outside the sequencer (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: project C: patterns, song, sounds, motion, recordings (damaged (part of it written over)); project D: patterns, song, sounds, motion, recordings (damaged (part of it written over)); shared user presets U127-U144; settings, factory favourites, calibration, saved template.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "polly",
    "name": "Polly",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared user presets U289-U378",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "some of it lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "shared user presets U379-U384",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U109-U126",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U055-U072",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a sector tail contains a valid update record",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U145-U288",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U073-U090",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U091-U108",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete power-on hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U019-U036",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U037-U054",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U127-U144",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: shared user presets U289-U378 (some of it lost); shared user presets U379-U384; shared user presets U109-U126; project A: patterns, song, sounds, motion, recordings; project B: patterns, song, sounds, motion, recordings; project C: patterns, song, sounds, motion, recordings; settings, factory favourites, calibration, saved template. At risk by itself, under a condition: shared user presets U055-U072. At risk when you act: project D: patterns, song, sounds, motion, recordings; shared user presets U145-U288; shared user presets U073-U090; shared user presets U091-U108; shared user presets U001-U018; shared user presets U019-U036; shared user presets U037-U054; shared user presets U127-U144.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "skiff",
    "name": "Skiff",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "project A: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if a readable old project needs pattern migration",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm clearing a pattern or song entry (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm erasing a sample slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy or change an entry’s pattern (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "project B: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if a readable old project needs pattern migration",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm clearing a pattern or song entry (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm erasing a sample slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy or change an entry’s pattern (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "project C: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if a readable old project needs pattern migration",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm clearing a pattern or song entry (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm erasing a sample slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy or change an entry’s pattern (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "project D: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if a readable old project needs pattern migration",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm clearing a pattern or song entry (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm erasing a sample slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy or change an entry’s pattern (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "shared user presets U037-U054",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it (its RESTORE LAST is on by default)",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a readable old autosave needs migration and its patterns fit",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U055-U072",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a readable old project needs pattern migration",
        "effect": "lost"
       },
       {
        "way": "when you confirm clearing a pattern or song entry (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you copy or change an entry’s pattern (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U127-U144",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a readable old project needs pattern migration",
        "effect": "lost"
       },
       {
        "way": "when you confirm clearing a pattern or song entry (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you copy or change an entry’s pattern (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESET SETTINGS (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U289-U378",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "by itself, only if a readable old Felucca/Skiff project needs migration, with room for its patterns",
        "effect": "some of it lost"
       },
       {
        "way": "when you SAVE AS from the web editor (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "some of it lost"
       },
       {
        "way": "when you save a project through the browser’s legacy command (it asks or arms a second turn first)",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "shared user presets U379-U384",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a readable old Felucca/Skiff project needs migration, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you SAVE AS from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project through the browser’s legacy command (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U109-U126",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a valid retired FM6 patch bank remains and no current patch object loads",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store an FM6 sound from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write an FM6 patch to a user sound from the editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U145-U288",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U073-U090",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U091-U108",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a sample upload in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save, import, erase or rename a user sound (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store a sound from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U019-U036",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save, import, erase or rename a user sound (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store a sound from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: project A: patterns, song, sounds, motion, recordings; project B: patterns, song, sounds, motion, recordings; project C: patterns, song, sounds, motion, recordings; project D: patterns, song, sounds, motion, recordings; shared user presets U037-U054; shared user presets U055-U072; shared user presets U127-U144; settings, factory favourites, calibration, saved template. At risk by itself, under a condition: shared user presets U289-U378 (some of it lost); shared user presets U379-U384; shared user presets U109-U126. At risk when you act: 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.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ]
 },
 "disagreements": [
  {
   "topic": "What holding REC does",
   "docs_say": "The recording guide still says REC held opens the mixer.",
   "source_says": "REC held captures recent playing, or takes the jam on SONG. GLO opens MIXER.",
   "docs_ref": {
    "kind": "doc",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "docs/RECORDING_PERFORMANCE.md",
    "lines": "43",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RECORDING_PERFORMANCE.md#L43"
   },
   "source_ref": {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/ui_input.c",
    "lines": "2112-2123",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2112-L2123"
   }
  },
  {
   "topic": "OCT- / OCT+ while editing notes",
   "docs_say": "README Controls still assigns the octave buttons to moving the step cursor during synth editing.",
   "source_says": "Off HOME they are Back and Enter: OCT+ places a note or opens its sheet; OCT- goes back. KNOB 1 moves the cursor.",
   "docs_ref": {
    "kind": "doc",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "README.md",
    "lines": "538-539",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L538-L539"
   },
   "source_ref": {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/ui_input.c",
    "lines": "2328-2362",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2328-L2362"
   }
  },
  {
   "topic": "Loading Felucca projects",
   "docs_say": "README compatibility still says Felucca 1.0 projects enter pattern 1.",
   "source_says": "The importer accepts supported Melodee schemas, FUN16 through FUN22, rather than Felucca project records.",
   "docs_ref": {
    "kind": "doc",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "README.md",
    "lines": "754-760",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L754-L760"
   },
   "source_ref": {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "141-150",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L141-L150"
   }
  },
  {
   "topic": "Choosing the BOOT project",
   "docs_say": "README assigns BOOT to PROJECT's KNOB 2. The manual also lists direct LOAD and SAVE controls on KNOB 3 and 4.",
   "source_says": "PROJECT uses KNOB 1 and 2 to choose a slot; KNOB 3 and 4 do nothing. Boot, Load and Save here are rows in the slot's OCT+ sheet.",
   "docs_ref": {
    "kind": "doc",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "web/manual/index.html",
    "lines": "299-303",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/manual/index.html#L299-L303"
   },
   "source_ref": {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/ui_input.c",
    "lines": "1787-1790",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1787-L1790"
   }
  },
  {
   "topic": "Starting a new song",
   "docs_say": "README asks for KNOB 3 to choose New song after turning KNOB 1 past the template.",
   "source_says": "KNOB 1 or 2 moves past T to New song, then OCT+ opens it. KNOB 3 is unused on PROJECT.",
   "docs_ref": {
    "kind": "doc",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "README.md",
    "lines": "549-553",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L549-L553"
   },
   "source_ref": {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/ui_input.c",
    "lines": "961-965",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L961-L965"
   }
  },
  {
   "topic": "The SCL settings page",
   "docs_say": "README assigns the SCL page's KNOB 2 directly to saving or removing a scale favourite.",
   "source_says": "SCL uses a list of settings. KNOB 2 moves the row; KNOB 1 changes it. Favourite is one row, and MPC degree appears with QNT MPC.",
   "docs_ref": {
    "kind": "doc",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "README.md",
    "lines": "874-876",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L874-L876"
   },
   "source_ref": {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/ui_list.c",
    "lines": "14-25",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_list.c#L14-L25"
   }
  },
  {
   "topic": "Turning PRESETS on Stage",
   "docs_say": "README Browsing sounds says turning PRESETS opens the browser.",
   "source_says": "On HOME, PRESETS changes the selected track's sound in place. The browser itself is SAVE > PRESETS.",
   "docs_ref": {
    "kind": "doc",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "README.md",
    "lines": "564-568",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L564-L568"
   },
   "source_ref": {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/ui_input.c",
    "lines": "2389-2397",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2389-L2397"
   }
  },
  {
   "topic": "Undo after browsing",
   "docs_say": "README Browsing sounds still tells you to hold SAVE to revert the sound.",
   "source_says": "EDIT held undoes the load. SAVE held saves the project, stopping playback first.",
   "docs_ref": {
    "kind": "doc",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "README.md",
    "lines": "582-584",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L582-L584"
   },
   "source_ref": {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/ui_input.c",
    "lines": "2150-2165",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2150-L2165"
   }
  },
  {
   "topic": "What FX opens",
   "docs_say": "README Controls says FX opens the insert pages directly.",
   "source_says": "FX first opens the rack. Choose a slot and OCT+ to open it; empty slots open their type list. FX from a slot returns to the rack.",
   "docs_ref": {
    "kind": "doc",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "README.md",
    "lines": "525",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L525"
   },
   "source_ref": {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/ui.c",
    "lines": "545-553",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L545-L553"
   }
  },
  {
   "topic": "Keys on DRUM SOUND and DRUM MIX",
   "docs_say": "The manual says black keys choose a lane and white keys choose a drum on DRUM SOUND and DRUM MIX.",
   "source_says": "Those EDIT pages use KNOB 1 to choose the drum. The grid key mapping applies on NOTES and DRUM HIT; keys on DRUM SOUND or DRUM MIX play notes through the kit.",
   "docs_ref": {
    "kind": "doc",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "web/manual/index.html",
    "lines": "499-505",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/manual/index.html#L499-L505"
   },
   "source_ref": {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/ui.c",
    "lines": "383-391",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L383-L391"
   }
  },
  {
   "topic": "What the HOLD setting times",
   "docs_say": "The manual describes HOLD as the duration for long actions on buttons and knobs.",
   "source_says": "HOLD sets the GLO/SCL quick-layer threshold. HOME, EDIT, SAVE, REC, SEQ and the page-sheet hold use their separate 0.7 s threshold; the encoders have no push action.",
   "docs_ref": {
    "kind": "doc",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "web/manual/index.html",
    "lines": "816",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/manual/index.html#L816"
   },
   "source_ref": {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/ui_input.c",
    "lines": "1567-1584",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1567-L1584"
   }
  },
  {
   "topic": "Unsupported presets at startup",
   "docs_say": "The README compatibility section and the storage plan say unreadable older preset formats stay protected as OLD FORMAT.",
   "source_says": "Startup clears unsupported matching-object preset banks and unreadable entries, with no replacement question. Compatible entries survive and supported preceding banks convert. Projects retain OLD FORMAT protection. The README release notes and boot-safety document describe the new reset policy.",
   "docs_ref": {
    "kind": "doc",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "README.md",
    "lines": "783-786",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L783-L786"
   },
   "source_ref": {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/shared_presets.c",
    "lines": "205-252",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/shared_presets.c#L205-L252"
   }
  },
  {
   "topic": "Restoring settings with a changed device voice budget",
   "docs_say": "The README describes complete backups containing the shared slots and restoring preceding complete backups through the current editor.",
   "source_says": "A nondefault device VOICE BUDGET is saved in tagged high bits of ext.usb_off. The settings-restore validator only accepts ext.usb_off values 0-3, so it rejects that settings object. Other objects commit separately and may already have been restored. This is read from the code, not tested on a unit.",
   "docs_ref": {
    "kind": "doc",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "README.md",
    "lines": "787-789",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L787-L789"
   },
   "source_ref": {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/editor_backup.c",
    "lines": "165-176",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L165-L176"
   }
  },
  {
   "topic": "Which library the sound designer saves to",
   "docs_say": "The sound-designer guide separates native engine banks from the general user presets.",
   "source_says": "All engines use the same 384 slots. Native engine adapters store their patch in that shared library.",
   "docs_ref": {
    "kind": "doc",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "docs/SOUND_DESIGNER.md",
    "lines": "115-119",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/SOUND_DESIGNER.md#L115-L119"
   },
   "source_ref": {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/shared_presets.c",
    "lines": "31-76",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/shared_presets.c#L31-L76"
   }
  },
  {
   "topic": "The storage plan’s unused sectors",
   "docs_say": "The storage table lists 0x9D000 and 0x9E000 as unused.",
   "source_says": "Those sectors form the final A/B pair of the shared preset library.",
   "docs_ref": {
    "kind": "doc",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "docs/STORAGE_PLAN.md",
    "lines": "87",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/STORAGE_PLAN.md#L87"
   },
   "source_ref": {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/storage.c",
    "lines": "25-35",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/storage.c#L25-L35"
   }
  }
 ],
 "not_mapped": [
  "Every engine page's individual value names (PROPHET 16 pages, FM6 operator pages, CZ-1's 38 pages); mapped as 'the page's values' with their sources in params.c.",
  "Developer paths: the editor protocol's test commands, the USB serial console, the M-UPGRADE update session.",
  "MIDI CC mapping (docs/RECORDING_PERFORMANCE.md lists it); not a panel control.",
  "What the other firmwares do to Melodee's records when they run after it: switching_note.when_you_leave, generated from the flash atlas; not tested on a unit.",
  "Nightly builds, older Synth only builds and retired Single core downloads are outside this v1.4.1 map; current packages use both cores.",
  "Complete backup restore with a nondefault device VOICE BUDGET was not tested on a unit. Source reading shows the exported tagged ext.usb_off fails the restore validator, after other archive objects may already have committed (settings_persist.c:127; editor_backup.c:173-176; web/fm1backup.js:155-156)."
 ],
 "lights": {
  "button_fx": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "You are on the FX pages.",
    "short_label": "ON PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "388-389",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L388-L389"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "36-37",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L36-L37"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Idle glow (Settings > LIGHTS above OFF).",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "417-418",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L417-L418"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/panel.c",
      "lines": "81-86",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/panel.c#L81-L86"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "You are on the SCL pages.",
    "short_label": "ON PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "388-389",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L388-L389"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "36-37",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L36-L37"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Idle glow (Settings > LIGHTS above OFF).",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "417-418",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L417-L418"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/panel.c",
      "lines": "81-86",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/panel.c#L81-L86"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "blinking",
    "action": "Its quick layer's map is showing.",
    "short_label": "LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "392-393",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L392-L393"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "You are on the ENV pages.",
    "short_label": "ON PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "388-389",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L388-L389"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "36-37",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L36-L37"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Idle glow (Settings > LIGHTS above OFF).",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "417-418",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L417-L418"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/panel.c",
      "lines": "81-86",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/panel.c#L81-L86"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "You are on the LFO pages.",
    "short_label": "ON PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "388-389",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L388-L389"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "36-37",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L36-L37"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Idle glow (Settings > LIGHTS above OFF).",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "417-418",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L417-L418"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/panel.c",
      "lines": "81-86",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/panel.c#L81-L86"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "You are on the EDIT pages.",
    "short_label": "ON PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "388-389",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L388-L389"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "36-37",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L36-L37"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Idle glow (Settings > LIGHTS above OFF).",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "417-418",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L417-L418"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/panel.c",
      "lines": "81-86",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/panel.c#L81-L86"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "You are on the GLO (and MIXER) pages.",
    "short_label": "ON PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "388-389",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L388-L389"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "36-37",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L36-L37"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Idle glow (Settings > LIGHTS above OFF).",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "417-418",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L417-L418"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/panel.c",
      "lines": "81-86",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/panel.c#L81-L86"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "blinking",
    "action": "Its quick layer's map is showing.",
    "short_label": "LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "392-393",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L392-L393"
     }
    ]
   }
  ],
  "button_home": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "You are on the Stage pages.",
    "short_label": "ON PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "388-389",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L388-L389"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "36-37",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L36-L37"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Idle glow (Settings > LIGHTS above OFF).",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "417-418",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L417-L418"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/panel.c",
      "lines": "81-86",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/panel.c#L81-L86"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "You are on the SAVE pages.",
    "short_label": "ON PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "388-389",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L388-L389"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "36-37",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L36-L37"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Idle glow (Settings > LIGHTS above OFF).",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "417-418",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L417-L418"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/panel.c",
      "lines": "81-86",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/panel.c#L81-L86"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "You are on the ARP pages.",
    "short_label": "ON PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "388-389",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L388-L389"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "36-37",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L36-L37"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Idle glow (Settings > LIGHTS above OFF).",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "417-418",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L417-L418"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/panel.c",
      "lines": "81-86",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/panel.c#L81-L86"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "flash",
    "action": "Flashes on the beat while any track's arpeggio plays (longer on the bar's first beat; dark flashes on ARP's own page).",
    "short_label": "ARP BEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "97-105",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L97-L105"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "390-391",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L390-L391"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "You are on the SEQ pages.",
    "short_label": "ON PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "388-389",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L388-L389"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "36-37",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L36-L37"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Idle glow (Settings > LIGHTS above OFF).",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "417-418",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L417-L418"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/panel.c",
      "lines": "81-86",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/panel.c#L81-L86"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Playing.",
    "short_label": "PLAYING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "394-397",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L394-L397"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "breathing",
    "action": "Counting in before recording.",
    "short_label": "COUNT-IN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "394-397",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L394-L397"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "370-374",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L370-L374"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Stopped (idle glow, LIGHTS above OFF).",
    "short_label": "STOPPED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "417-418",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L417-L418"
     }
    ]
   },
   {
    "light": "green",
    "mode": "any",
    "gesture": "off",
    "action": "Melodee never drives PLAY's second (green) LED: its LED table has no position for it (Felucca found it later, in 1.6).",
    "short_label": "UNUSED",
    "evidence": "inferred",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/hal/fm1_input.h",
      "lines": "71-78",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/hal/fm1_input.h#L71-L78"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "394-397",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L394-L397"
     },
     {
      "kind": "source",
      "repo": "hugelton/Felucca",
      "ref": "v1.6",
      "commit": "1727537624390cc3f9c7dff2456b43b3a8edb005",
      "path": "firmware/src/ui_input.c",
      "lines": "29",
      "url": "https://github.com/hugelton/Felucca/blob/1727537624390cc3f9c7dff2456b43b3a8edb005/firmware/src/ui_input.c#L29-L29"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Recording is active on at least one track, regardless of the track selected.",
    "short_label": "RECORDING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "381-382",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L381-L382"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "394-397",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L394-L397"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "breathing",
    "action": "Armed, waiting for playback or for the track's next pattern start.",
    "short_label": "ARMED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "394-397",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L394-L397"
     },
     {
      "kind": "doc",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "docs/RECORDING_PERFORMANCE.md",
      "lines": "3-20",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RECORDING_PERFORMANCE.md#L3-L20"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "381-397",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L381-L397"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Idle glow.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "417-418",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L417-L418"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "stage",
    "gesture": "lit",
    "action": "On Stage: the octave is shifted down.",
    "short_label": "OCT DOWN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "57-72",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L57-L72"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Off Stage: lit, meaning Back is available.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "57-72",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L57-L72"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "lit",
    "action": "In a quick layer only OCT- is lit (it puts back the layer's changes).",
    "short_label": "PUT BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "57-72",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L57-L72"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "stage",
    "gesture": "lit",
    "action": "On Stage: the octave is shifted up.",
    "short_label": "OCT UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "57-72",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L57-L72"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Off Stage: lit where Enter does something on this page.",
    "short_label": "ENTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "57-72",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L57-L72"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "blinking",
    "action": "In a question, the menu, an action page, NAME and NEW SONG: blinks when OCT+ would act.",
    "short_label": "CONFIRM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "57-72",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L57-L72"
     }
    ]
   },
   {
    "mode": "designer",
    "gesture": "lit",
    "action": "In the sound designer both OCT LEDs are lit (previous and next stage).",
    "short_label": "STAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "57-72",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L57-L72"
     }
    ]
   }
  ],
  "key_lights": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "A key you press, or whose note is sounding on the selected track (MIDI in too).",
    "short_label": "SOUNDING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "349-365",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L349-L365"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "401-415",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L401-L415"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "349-366",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L349-L366"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Keys that play something: with QNT OFF the scale's notes, on a DRUM track every key, in WHITE/ALL/MPC the keys that are not silent. Brightness: Settings > LIGHTS.",
    "short_label": "PLAYABLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "349-366",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L349-L366"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/panel.c",
      "lines": "81-86",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/panel.c#L81-L86"
     },
     {
      "kind": "doc",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L445-L448",
      "path": "README.md",
      "lines": "445-448",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "lit",
    "action": "The current pattern; also the selected track on the first four black keys, and the pattern key being held or shown in its dialog.",
    "short_label": "PLAYING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "120-140",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L120-L140"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "dim",
    "action": "Other patterns holding data, plus other tracks in use on the first four black keys.",
    "short_label": "USED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "120-140",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L120-L140"
     }
    ]
   },
   {
    "mode": "seq_held",
    "gesture": "breathing",
    "action": "A pattern queued to switch or waiting for an edit at the loop boundary; an armed track on its black key unless the key is already bright.",
    "short_label": "QUEUED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "120-140",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L120-L140"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "lit",
    "action": "For tracks in use: black keys 1-4 show tracks that can sound; white keys 1-4 show held solos.",
    "short_label": "SOUNDING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "332-347",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L332-L347"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "blinking",
    "action": "Available solo keys for tracks in use, unmute all, and tap tempo with internal clock.",
    "short_label": "ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "332-347",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L332-L347"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "lit",
    "action": "The root note's keys.",
    "short_label": "ROOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "332-347",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L332-L347"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "blinking",
    "action": "The scale's other notes.",
    "short_label": "SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_layer.c",
      "lines": "332-347",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_layer.c#L332-L347"
     }
    ]
   },
   {
    "mode": "drum_grid",
    "gesture": "lit",
    "action": "White keys: the selected lane's hits on the page (accents while C#5 is held), with the playing step inverted. Black keys: the lane, ACC while held, the page keys on long patterns.",
    "short_label": "GRID",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "75-94",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L75-L94"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "lit",
    "action": "Every key that types or edits; the key whose letters are cycling blinks.",
    "short_label": "TYPING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "302-311",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L302-L311"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_name.c",
      "lines": "4-22",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_name.c#L4-L22"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "flash",
    "action": "During rescue boot, LEDs in the first matrix column flash three times briefly before the retained USB updater, or once for longer before ROM USB boot.",
    "short_label": "BOOT RESCUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/stub/stub.c",
      "lines": "179-189",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/stub/stub.c#L179-L189"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/stub/stub.c",
      "lines": "298-313",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/stub/stub.c#L298-L313"
     }
    ]
   },
   {
    "mode": "pattern_key_dialog",
    "gesture": "lit",
    "action": "The selected track and current or dialog-source pattern are bright.",
    "short_label": "PAT CURRENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "120-140",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L120-L140"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "401-415",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L401-L415"
     }
    ]
   },
   {
    "mode": "pattern_key_dialog",
    "gesture": "dim",
    "action": "Other tracks in use and patterns holding data stay dim.",
    "short_label": "PAT USED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "120-140",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L120-L140"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "401-415",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L401-L415"
     }
    ]
   },
   {
    "mode": "pattern_key_dialog",
    "gesture": "breathing",
    "action": "A queued pattern or pending pattern edit breathes; an armed track breathes unless its key is already bright.",
    "short_label": "PAT WAIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "120-140",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L120-L140"
     },
     {
      "kind": "source",
      "repo": "keremimo/melodee",
      "ref": "v1.4.1",
      "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
      "path": "firmware/src/ui_input.c",
      "lines": "401-415",
      "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L401-L415"
     }
    ]
   }
  ]
 },
 "groups": {
  "key_lights": [
   "led_a3",
   "led_a4",
   "led_as3",
   "led_as4",
   "led_b3",
   "led_b4",
   "led_c4",
   "led_c5",
   "led_cs4",
   "led_cs5",
   "led_d4",
   "led_d5",
   "led_ds4",
   "led_ds5",
   "led_e4",
   "led_e5",
   "led_f3",
   "led_f4",
   "led_f5",
   "led_fs3",
   "led_fs4",
   "led_fs5",
   "led_g3",
   "led_g4",
   "led_g5",
   "led_gs3",
   "led_gs4"
  ]
 },
 "overwrites_without_asking": [
  {
   "what": "Hold SAVE or SAVE + REC quick-saves the music to the project it came from, stopping playback first. A new song opens PROJECT so you can choose its first slot.",
   "asks": "no for a project with its own slot",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "562-582",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L562-L582"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "588-608",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L588-L608"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "2149-2154",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2149-L2154"
    }
   ]
  },
  {
   "what": "Autosave is on by default. After five seconds stopped and untouched it writes changed music back to the last loaded or saved project slot; a new song waits for its first save.",
   "asks": "no",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "703-727",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "610-625",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L625"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/settings_persist.c",
     "lines": "80-82",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/settings_persist.c#L80-L82"
    }
   ]
  },
  {
   "what": "With SEQ held, hold a white pattern key until its action dialog opens, then press another white pattern key to copy over that destination, without another question. The PATTERNS sheet's Copy to route asks before replacing a nonempty destination. A copy over the playing or occupied pattern waits for the loop end while playback runs.",
   "asks": "only on the Copy to route over a nonempty destination",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "253-261",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L253-L261"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "308-346",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L308-L346"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_patterns.c",
     "lines": "305-324",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_patterns.c#L305-L324"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/motion.c",
     "lines": "436-467",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/motion.c#L436-L467"
    }
   ]
  },
  {
   "what": "Holding EDIT during recording erases notes as the playhead crosses them, including a tied note and its tail. Whole-take undo can restore the erase after recording finishes or is disarmed, while its undo snapshot remains valid.",
   "asks": "no",
   "undo": "yes: finish recording, then hold EDIT to undo the take; EDIT + OCT+ redoes it",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1688-1715",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1688-L1715"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq_erase.c",
     "lines": "60-94",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq_erase.c#L60-L94"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/recording_undo.c",
     "lines": "71-120",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/recording_undo.c#L71-L120"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "779-800",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L779-L800"
    }
   ]
  },
  {
   "what": "PROJECT, a slot's sheet, Load replaces the music you are working on without a save question.",
   "asks": "no",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "107-108",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L107-L108"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1238-1241",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1238-L1241"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "782-790",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L782-L790"
    }
   ]
  },
  {
   "what": "PROJECT, T, Save as template replaces the saved template. A protected unreadable settings or template record asks for replacement first.",
   "asks": "no for a readable current template",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1231-1237",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1231-L1237"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "933-973",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L933-L973"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "844-848",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L844-L848"
    }
   ]
  },
  {
   "what": "At startup foreign or invalid settings are replaced with defaults. Unsupported preset banks or unreadable entries under a matching storage header are also reset; readable entries survive. No overwrite question appears before these writes.",
   "asks": "no",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/settings_persist.c",
     "lines": "32-60",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/settings_persist.c#L32-L60"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/settings_persist.c",
     "lines": "104-133",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/settings_persist.c#L104-L133"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "1131-1208",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L1131-L1208"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/shared_presets.c",
     "lines": "205-252",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/shared_presets.c#L205-L252"
    }
   ]
  },
  {
   "what": "A favourite star on a shared user preset writes its whole bank when the transport stops. A used preset can be saved, renamed or replaced in that same bank; its other readable slots survive.",
   "asks": "no",
   "undo": "no for the stored bank",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/shared_presets.c",
     "lines": "14-29",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/shared_presets.c#L14-L29"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/upreset.c",
     "lines": "116-136",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/upreset.c#L116-L136"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/upreset.c",
     "lines": "421-480",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/upreset.c#L421-L480"
    }
   ]
  },
  {
   "what": "Restoring an older 28-object archive first clears the current U379-U384 bank, before any archived objects are written, although that archive contains no copy of those six slots. Legacy Prophet conversion can later fill them with spill sounds; it does not keep their current contents. Back up the current library before restoring an older archive.",
   "asks": "no extra question before the preliminary bank clear",
   "undo": "no",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "web/fm1backup.js",
     "lines": "146-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/fm1backup.js#L146-L156"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/editor_backup.c",
     "lines": "39-45",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L39-L45"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/editor_backup.c",
     "lines": "179-186",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L179-L186"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/upreset.c",
     "lines": "106-113",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/upreset.c#L106-L113"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/storage.c",
     "lines": "67-70",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/storage.c#L67-L70"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/shared_presets.c",
     "lines": "282-298",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/shared_presets.c#L282-L298"
    }
   ]
  },
  {
   "what": "Init sound on the PROPHET or FM6 Store sheet resets the current track sound immediately. It changes RAM first; with autosave on, the current project slot can retain the reset after 5 seconds stopped and idle.",
   "asks": "no",
   "undo": "PROPHET: hold EDIT; FM6: this action takes no undo snapshot",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "77-99",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L77-L99"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "114-115",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L114-L115"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "80-98",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L80-L98"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1153-1163",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1153-L1163"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1192-1203",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1192-L1203"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/fm6_store.c",
     "lines": "148-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/fm6_store.c#L148-L156"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/eng_fm6.c",
     "lines": "201-214",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L201-L214"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "703-727",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "610-624",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L624"
    }
   ]
  }
 ],
 "fixed_after_check": "2026-10-13",
 "check_fixes": [
  {
   "error": "2 (modes.dialog 'before anything destructive')",
   "fixed": "modes.dialog now lists what asks and points to the new overwrites_without_asking list (quick save, autosave, SEQ-held pattern copy, live ERASE, project LOAD, Save as template)."
  },
  {
   "error": "cross-map (no 'a question always comes first')",
   "fixed": "QUICK SAVE, the eight SEQ-held pattern keys and the sheet's DO IT now say which act without asking; new overwrites_without_asking list."
  },
  {
   "error": "3 (live ERASE undo)",
   "fixed": "button_edit notes/hold now says undo cannot restore an erased pass; also in overwrites_without_asking and the md."
  },
  {
   "error": "4 (recovery-tool citation)",
   "fixed": "The recovery-tool backup claim now cites docs/RECOVERY.md:40-51. BUILDING.md:506-509 at v1.3.1 is about the Synth-only build, so it is not cited."
  },
  {
   "error": "1 (missing: installing Melodee overwrites the previous firmware's data)",
   "fixed": "New switching_note.overwrites_previous: ten areas with addresses, what Melodee stores, when it writes (the first start writes FM6 and CZ-1 banks by itself), and what Felucca, SLOOP, JIANT, X0X, FoMni and stock lose; md 'Before you switch' rewritten."
  },
  {
   "error": "cross-map (going back a version)",
   "fixed": "New switching_note.going_back for older Melodee versions."
  },
  {
   "error": "cross-map (backup exactness)",
   "fixed": "back_up_first lists the 28 objects the Complete backup holds and what it does not."
  },
  {
   "error": "minor (copied wording, found by our own 8-word scan; not in the report)",
   "fixed": "Reworded the REC arm text, the chord-keys text, SELECT's page turning, the ENV note-length modifier, the boot and second-core notes; the scan now finds only lists of on-screen names."
  },
  {
   "error": "5 (INDEX.md word count)",
   "fixed": "Not changed here: INDEX.md is the shared index (the coordinator fixes it)."
  },
  {
   "error": "R2-1 (1.3.2 released)",
   "fixed": "Re-mapped to v1.3.2 (a783161): release fields and install link, changes_from_mapped_previous, dual_core and going_back rewritten for the new clock handling, version mentions. 1518 Melodee sources now cite 1.3.2 after a line-identity check (6 re-pinned by hand where the diff touched them); 38 still cite 1.3.1: overwrites_previous, left untouched for the atlas, and one deliberate 1.3.1 citation in going_back.",
   "round": 2
  },
  {
   "error": "R2-2 (REPLACE OLD SETTINGS? wording)",
   "fixed": "modes.dialog and melodee.md now say that yes erases the earlier firmware's whole settings record, which can hold far more than settings; the record's contents are left to the flash atlas. overwrites_previous was not touched (atlas).",
   "round": 2
  }
 ],
 "checker_disputes": [],
 "changes_from_mapped_previous": {
  "from": "v1.3.2 (a783161)",
  "to": "v1.4.1 (1cccd69, released 2026-10-15)",
  "summary": "One to four tracks, HOME chord view and assignable SELECT, shared 384-slot sound library, FX racks and TONE, editable motion, continuous explicit REC and one-pass pattern shortcuts, recording undo, deferred destructive pattern edits, duplex USB audio, larger type and new settings. Clock retuning is removed. Startup settings repair, preset migration/reset, and retained-loader boot recovery change switching risks. The 1.4.1 installer fixes backup capability checks before returning to official V15.",
  "sources": [
   {
    "kind": "doc",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "docs/RELEASE_1.4.0.md",
    "lines": "4-55",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RELEASE_1.4.0.md#L4-L55"
   },
   {
    "kind": "doc",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "docs/RELEASE_1.4.1.md",
    "lines": "1-20",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/docs/RELEASE_1.4.1.md#L1-L20"
   }
  ]
 },
 "fixed_after_recheck": "2026-10-13",
 "refreshed_from": {
  "release": "v1.3.2",
  "commit": "a783161d59dc1bc1b5042df482e622ec4de74c9d",
  "date": "2026-10-16"
 },
 "saving_note": {
  "power_off": "Switching off does not save the music. Save first, or let autosave finish: it is on by default and writes changed music to the project it came from after five seconds stopped and untouched. A new song needs its first save before autosave has a slot. Hold SAVE or SAVE + REC stops playback and quick-saves; a new song opens PROJECT instead. Keep power connected during startup maintenance.",
  "settings": "Settings and the template use their own A/B record. Live settings saves wait for stopped transport, silent device voices and no USB playback or capture stream; failed writes retry. Shared user presets U001-U384 hold their native voices and favourite stars in the same preset bank. All claims were read in source, not tested on a unit.",
  "evidence": "read-in-source",
  "source": [
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/ui_input.c",
    "lines": "562-582",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L562-L582"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/ui_input.c",
    "lines": "703-727",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "588-625",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L588-L625"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/project.c",
    "lines": "1240-1294",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L1240-L1294"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/upreset.c",
    "lines": "116-136",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/upreset.c#L116-L136"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/shared_presets.c",
    "lines": "14-29",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/shared_presets.c#L14-L29"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/ui_boot.c",
    "lines": "55-58",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_boot.c#L55-L58"
   },
   {
    "kind": "source",
    "repo": "keremimo/melodee",
    "ref": "v1.4.1",
    "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
    "path": "firmware/src/ui_input.c",
    "lines": "2149-2154",
    "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2149-L2154"
   }
  ]
 },
 "refresh_check_fixes": [
  {
   "round": 1,
   "error": "1: legacy restore clears U379-U384",
   "fixed": "Disclosed the preliminary tail-bank clear, its order, and later Prophet spill conversion; advised backing up the current library.",
   "at": "switching_note.back_up_first",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "web/fm1backup.js",
     "lines": "146-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/fm1backup.js#L146-L156"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/editor_backup.c",
     "lines": "39-45",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L39-L45"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/editor_backup.c",
     "lines": "179-186",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L179-L186"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/upreset.c",
     "lines": "106-113",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/upreset.c#L106-L113"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/storage.c",
     "lines": "67-70",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/storage.c#L67-L70"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/shared_presets.c",
     "lines": "282-298",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/shared_presets.c#L282-L298"
    }
   ]
  },
  {
   "round": 1,
   "error": "1: legacy restore clears U379-U384",
   "fixed": "Added the legacy-archive restore write as an overwrite without a separate question.",
   "at": "overwrites_without_asking[8]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "web/fm1backup.js",
     "lines": "146-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/fm1backup.js#L146-L156"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/editor_backup.c",
     "lines": "39-45",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L39-L45"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/editor_backup.c",
     "lines": "179-186",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L179-L186"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/upreset.c",
     "lines": "106-113",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/upreset.c#L106-L113"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/storage.c",
     "lines": "67-70",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/storage.c#L67-L70"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/shared_presets.c",
     "lines": "282-298",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/shared_presets.c#L282-L298"
    }
   ]
  },
  {
   "round": 1,
   "error": "1: legacy restore clears U379-U384",
   "fixed": "Added the preliminary empty-bank commit and its archive/flash identities and timing.",
   "at": "refresh/work/melodee.storage.json:changes[12]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "web/fm1backup.js",
     "lines": "146-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/fm1backup.js#L146-L156"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/editor_backup.c",
     "lines": "39-45",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L39-L45"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/editor_backup.c",
     "lines": "179-186",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L179-L186"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/upreset.c",
     "lines": "106-113",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/upreset.c#L106-L113"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/storage.c",
     "lines": "67-70",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/storage.c#L67-L70"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/shared_presets.c",
     "lines": "282-298",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/shared_presets.c#L282-L298"
    }
   ]
  },
  {
   "round": 1,
   "error": "1: legacy restore clears U379-U384",
   "fixed": "Added explicit owner advice about the six current sounds cleared by a preceding archive restore.",
   "at": "control-maps/melodee.md:Before you switch firmware",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "web/fm1backup.js",
     "lines": "146-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/fm1backup.js#L146-L156"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/editor_backup.c",
     "lines": "39-45",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L39-L45"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/editor_backup.c",
     "lines": "179-186",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L179-L186"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/upreset.c",
     "lines": "106-113",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/upreset.c#L106-L113"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/storage.c",
     "lines": "67-70",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/storage.c#L67-L70"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/shared_presets.c",
     "lines": "282-298",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/shared_presets.c#L282-L298"
    }
   ]
  },
  {
   "round": 1,
   "error": "2: sheet rows may act immediately",
   "fixed": "Removed the blanket confirmation promise and named immediate note, hit and lane actions.",
   "at": "controls.button_oct_up[21]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "220-235",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L220-L235"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_motion.c",
     "lines": "136-147",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_motion.c#L136-L147"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "81-83",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L81-L83"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "154-158",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L154-L158"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "107-109",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L107-L109"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "938-942",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L938-L942"
    }
   ]
  },
  {
   "round": 1,
   "error": "2: sheet rows may act immediately",
   "fixed": "Named the three sheet edits that run without a confirmation screen.",
   "at": "control-maps/melodee.md:What overwrites without asking",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "220-235",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L220-L235"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_motion.c",
     "lines": "136-147",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_motion.c#L136-L147"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "81-83",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L81-L83"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "154-158",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L154-L158"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "107-109",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L107-L109"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "938-942",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L938-L942"
    }
   ]
  },
  {
   "round": 1,
   "error": "4: WAIT LOOP is a recording wait",
   "fixed": "Separated recording-wait status from queued destructive-edit messages and pattern lights.",
   "at": "control-maps/melodee.md:Patterns and songs",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_draw.c",
     "lines": "214-217",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L214-L217"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_draw.c",
     "lines": "271-275",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L271-L275"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "123-140",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L123-L140"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "209-227",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L209-L227"
    }
   ]
  },
  {
   "round": 1,
   "error": "5: staging integrity was overstated",
   "fixed": "Limited the retention claim to implemented structural checks and identified the unchecked-body consequence as inference.",
   "at": "refresh/work/melodee.storage.json:changes[58]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ota.c",
     "lines": "395-428",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ota.c#L395-L428"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ota.c",
     "lines": "437-481",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ota.c#L437-L481"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/stub/stub_core.h",
     "lines": "155-186",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/stub/stub_core.h#L155-L186"
    }
   ]
  },
  {
   "round": 1,
   "error": "3: octave controls on both HOME views",
   "fixed": "Extended the octave and light explanations to the chord view, with overlays taking priority.",
   "at": "control-maps/melodee.md:How the panel thinks / Lights",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "48-72",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L48-L72"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1995-2003",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1995-L2003"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "2289-2299",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L2289-L2299"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_view.c",
     "lines": "3-11",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_view.c#L3-L11"
    }
   ]
  },
  {
   "round": 1,
   "error": "6: explicit template save bypasses deduplication",
   "fixed": "Qualified the unchanged-settings skip and documented the explicit-template-save exception.",
   "at": "refresh/work/melodee.storage.json:changes[0].new.ordinary_writes",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "934-968",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L934-L968"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "1265-1278",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L1265-L1278"
    }
   ]
  },
  {
   "round": 1,
   "error": "A section 2: four persisted preferences",
   "fixed": "Added the saved byte/bit locations of picker popups, font and both SELECT assignments.",
   "at": "refresh/work/melodee.storage.json:changes[0],changes[71]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui.c",
     "lines": "70-89",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui.c#L70-L89"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/favorites.c",
     "lines": "8-17",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/favorites.c#L8-L17"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/settings_persist.c",
     "lines": "116-127",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/settings_persist.c#L116-L127"
    }
   ]
  },
  {
   "round": 1,
   "error": "A section 2: budget restore consequence",
   "fixed": "Carried the already-disclosed map backup limitation into the storage report, including partial-restore order.",
   "at": "refresh/work/melodee.storage.json:changes[73]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/settings_persist.c",
     "lines": "121-127",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/settings_persist.c#L121-L127"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/editor_backup.c",
     "lines": "165-176",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/editor_backup.c#L165-L176"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "web/fm1backup.js",
     "lines": "152-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/fm1backup.js#L152-L156"
    }
   ]
  },
  {
   "round": 1,
   "error": "B2: empty-pattern arming exception",
   "fixed": "Qualified one-pass arming and preserved the existing continuous REC state.",
   "at": "controls.button_seq[2]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "265-281",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq.c",
     "lines": "1033-1040",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
    }
   ]
  },
  {
   "round": 1,
   "error": "B2: empty-pattern arming exception",
   "fixed": "Added the unarmed-track condition and the continuous-arm exception.",
   "at": "controls.key_f3[1]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "265-281",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq.c",
     "lines": "1033-1040",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
    }
   ]
  },
  {
   "round": 1,
   "error": "B2: empty-pattern arming exception",
   "fixed": "Added the unarmed-track condition and the continuous-arm exception.",
   "at": "controls.key_g3[1]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "265-281",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq.c",
     "lines": "1033-1040",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
    }
   ]
  },
  {
   "round": 1,
   "error": "B2: empty-pattern arming exception",
   "fixed": "Added the unarmed-track condition and the continuous-arm exception.",
   "at": "controls.key_a3[1]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "265-281",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq.c",
     "lines": "1033-1040",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
    }
   ]
  },
  {
   "round": 1,
   "error": "B2: empty-pattern arming exception",
   "fixed": "Added the unarmed-track condition and the continuous-arm exception.",
   "at": "controls.key_b3[1]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "265-281",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq.c",
     "lines": "1033-1040",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
    }
   ]
  },
  {
   "round": 1,
   "error": "B2: empty-pattern arming exception",
   "fixed": "Added the unarmed-track condition and the continuous-arm exception.",
   "at": "controls.key_c4[1]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "265-281",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq.c",
     "lines": "1033-1040",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
    }
   ]
  },
  {
   "round": 1,
   "error": "B2: empty-pattern arming exception",
   "fixed": "Added the unarmed-track condition and the continuous-arm exception.",
   "at": "controls.key_d4[1]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "265-281",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq.c",
     "lines": "1033-1040",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
    }
   ]
  },
  {
   "round": 1,
   "error": "B2: empty-pattern arming exception",
   "fixed": "Added the unarmed-track condition and the continuous-arm exception.",
   "at": "controls.key_e4[1]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "265-281",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq.c",
     "lines": "1033-1040",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
    }
   ]
  },
  {
   "round": 1,
   "error": "B2: empty-pattern arming exception",
   "fixed": "Added the unarmed-track condition and the continuous-arm exception.",
   "at": "controls.key_f4[1]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "265-281",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq.c",
     "lines": "1033-1040",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
    }
   ]
  },
  {
   "round": 1,
   "error": "B2: empty-pattern arming exception",
   "fixed": "Qualified empty-pattern one-pass recording in the SEQ-held mode description.",
   "at": "modes[33]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "265-281",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq.c",
     "lines": "1033-1040",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
    }
   ]
  },
  {
   "round": 1,
   "error": "B2: empty-pattern arming exception",
   "fixed": "Explained that an existing explicit REC arm stays continuous when an empty pattern is selected.",
   "at": "control-maps/melodee.md:Patterns and songs",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "265-281",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq.c",
     "lines": "1033-1040",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
    }
   ]
  },
  {
   "round": 1,
   "error": "B3: WAIT LOOP is recording wait",
   "fixed": "Confirmed the part A error 4 correction already distinguishes recording wait from deferred-edit feedback; no further wording change needed.",
   "at": "control-maps/melodee.md:Patterns and songs",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_draw.c",
     "lines": "214-217",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L214-L217"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_draw.c",
     "lines": "271-276",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L271-L276"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "209-229",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L209-L229"
    }
   ]
  },
  {
   "round": 1,
   "error": "B4: missing SHARED sheet actions",
   "fixed": "Added the shared-effects sheet, both access routes and its Routing/Clear shared FX rows.",
   "at": "modes[53]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1567-1584",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1567-L1584"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1993-2000",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1993-L2000"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "273-290",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L273-L290"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "321-323",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L321-L323"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "159-164",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L159-L164"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "163-164",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L163-L164"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "342-347",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L342-L347"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_draw.c",
     "lines": "912-915",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L912-L915"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1917-1922",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1917-L1922"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "249-266",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L249-L266"
    }
   ]
  },
  {
   "round": 1,
   "error": "B4: missing SHARED sheet actions",
   "fixed": "Added hold access to the shared-effects sheet from this page.",
   "at": "controls.button_oct_up[34]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1567-1584",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1567-L1584"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1993-2000",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1993-L2000"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "273-290",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L273-L290"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "321-323",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L321-L323"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "159-164",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L159-L164"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    }
   ]
  },
  {
   "round": 1,
   "error": "B4: missing SHARED sheet actions",
   "fixed": "Added hold access to the shared-effects sheet from this page.",
   "at": "controls.button_oct_up[35]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1567-1584",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1567-L1584"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1993-2000",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1993-L2000"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "273-290",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L273-L290"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "321-323",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L321-L323"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "159-164",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L159-L164"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    }
   ]
  },
  {
   "round": 1,
   "error": "B4: missing SHARED sheet actions",
   "fixed": "Mapped the sheet’s routing value to KNOB 1.",
   "at": "controls.encoder_knob1[49]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "159-164",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L159-L164"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    }
   ]
  },
  {
   "round": 1,
   "error": "B4: missing SHARED sheet actions",
   "fixed": "Mapped selection of the shared-sheet rows to KNOB 2.",
   "at": "controls.encoder_knob2[46]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "159-164",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L159-L164"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    }
   ]
  },
  {
   "round": 1,
   "error": "B4: missing SHARED sheet actions",
   "fixed": "Mapped row execution, the clear confirmation and the values it resets.",
   "at": "controls.button_oct_up[36]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "159-164",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L159-L164"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "163-164",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L163-L164"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "342-347",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L342-L347"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_draw.c",
     "lines": "912-915",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L912-L915"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1917-1922",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1917-L1922"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "249-266",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L249-L266"
    }
   ]
  },
  {
   "round": 1,
   "error": "B4: missing SHARED sheet actions",
   "fixed": "Added the shared-sheet screen description.",
   "at": "controls.screen[54]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "159-164",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L159-L164"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "321-323",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L321-L323"
    }
   ]
  },
  {
   "round": 1,
   "error": "B4: missing SHARED sheet actions",
   "fixed": "Added the shared-sheet access, row controls, confirmation and clear scope.",
   "at": "control-maps/melodee.md:Effects",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1567-1584",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1567-L1584"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1993-2000",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1993-L2000"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "273-290",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L273-L290"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "321-323",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L321-L323"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "159-164",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L159-L164"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "163-164",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L163-L164"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "342-347",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L342-L347"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_draw.c",
     "lines": "912-915",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L912-L915"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1917-1922",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1917-L1922"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "249-266",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L249-L266"
    }
   ]
  },
  {
   "round": 1,
   "error": "B2: empty-pattern arming exception",
   "fixed": "Clarified the recording-arm rule governing project content; no flash-write timing or format changed.",
   "at": "refresh/work/melodee.storage.json:changes[13-16].new.recording_arm_rule",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "265-281",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L265-L281"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq.c",
     "lines": "1033-1040",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1040"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "239-245",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L239-L245"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "703-727",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "610-624",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L624"
    }
   ]
  },
  {
   "round": 1,
   "error": "B4: missing SHARED sheet actions",
   "fixed": "Recorded which shared values clear and that persistence uses the existing project-save/autosave paths.",
   "at": "refresh/work/melodee.storage.json:changes[13-16].new.shared_fx_clear",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "163-164",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L163-L164"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "342-347",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L342-L347"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_draw.c",
     "lines": "912-915",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_draw.c#L912-L915"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1917-1922",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1917-L1922"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/params.c",
     "lines": "249-266",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/params.c#L249-L266"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "239-245",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L239-L245"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "703-727",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "610-624",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L624"
    }
   ]
  },
  {
   "round": 1,
   "error": "B1: REC light covers every track",
   "fixed": "Replaced the selected-track claim with the whole-device recording state.",
   "at": "lights.button_rec[0]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "381-382",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L381-L382"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "394-397",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L394-L397"
    }
   ]
  },
  {
   "round": 1,
   "error": "B1: REC light covers every track",
   "fixed": "Made the guide explicit that REC reports recording across all tracks.",
   "at": "control-maps/melodee.md:Lights",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "381-382",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L381-L382"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "394-397",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L394-L397"
    }
   ]
  },
  {
   "round": 1,
   "error": "B5: copied REC wording",
   "fixed": "Rephrased the REC-arm explanation in original wording without changing its behavior.",
   "at": "controls.button_rec[0]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "508-530",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L508-L530"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq.c",
     "lines": "1033-1043",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1033-L1043"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq.c",
     "lines": "920-945",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L920-L945"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "511-533",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L511-L533"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/seq.c",
     "lines": "1134-1141",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/seq.c#L1134-L1141"
    }
   ]
  },
  {
   "round": 2,
   "error": "1: Store Init runs immediately",
   "fixed": "Distinguished confirmed Stage/sound Init from immediate Store Init; stated PROPHET undo, missing FM6 snapshot and project-autosave risk.",
   "at": "controls.button_oct_up[21]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "77-99",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L77-L99"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "114-115",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L114-L115"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "80-98",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L80-L98"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1153-1163",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1153-L1163"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1192-1203",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1192-L1203"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/fm6_store.c",
     "lines": "148-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/fm6_store.c#L148-L156"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/eng_fm6.c",
     "lines": "201-214",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L201-L214"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "703-727",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "610-624",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L624"
    }
   ]
  },
  {
   "round": 2,
   "error": "1: Store Init runs immediately",
   "fixed": "Limited the Init confirmation claim to Stage/sound sheets and explained immediate Store Init with engine-specific undo.",
   "at": "modes[37]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "77-99",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L77-L99"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "114-115",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L114-L115"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "80-98",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L80-L98"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1153-1163",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1153-L1163"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1192-1203",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1192-L1203"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/fm6_store.c",
     "lines": "148-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/fm6_store.c#L148-L156"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/eng_fm6.c",
     "lines": "201-214",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L201-L214"
    }
   ]
  },
  {
   "round": 2,
   "error": "1: Store Init runs immediately",
   "fixed": "Added the immediate Store Init warning, its undo difference and the existing project-autosave consequence.",
   "at": "overwrites_without_asking[9]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "77-99",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L77-L99"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "114-115",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L114-L115"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "80-98",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L80-L98"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1153-1163",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1153-L1163"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1192-1203",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1192-L1203"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/fm6_store.c",
     "lines": "148-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/fm6_store.c#L148-L156"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/eng_fm6.c",
     "lines": "201-214",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L201-L214"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "703-727",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "610-624",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L624"
    }
   ]
  },
  {
   "round": 2,
   "error": "1: Store Init runs immediately",
   "fixed": "Replaced - **Immediate sheet edits:** Delete note, Clear hit and Clear lane run as soon as you choose them; there is no confirmation screen. with - **Immediate sheet edits:** Delete note, Clear hit and Clear lane run as soon as you choose them; there is no confirmation screen. Init sound on the PROPHET or FM6 Store sheet also resets the current sound immediately. Hold EDIT can undo the PROPHET reset; the FM6 reset takes no undo snapshot. With autosave on, the reset can be written to the current project slot after 5 seconds stopped and idle.",
   "at": "control-maps/melodee.md:Immediate sheet edits",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "77-99",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L77-L99"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "114-115",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L114-L115"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "80-98",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L80-L98"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1153-1163",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1153-L1163"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1192-1203",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1192-L1203"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/fm6_store.c",
     "lines": "148-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/fm6_store.c#L148-L156"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/eng_fm6.c",
     "lines": "201-214",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L201-L214"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "703-727",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "610-624",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L624"
    }
   ]
  },
  {
   "round": 2,
   "error": "1: Store Init runs immediately",
   "fixed": "Replaced PATTERNS > Copy to over a used pattern, Init sound, removing a track with PATTERNS > Copy to over a used pattern, Init sound from Stage or a sound sheet, removing a track",
   "at": "control-maps/melodee.md:Asks first",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "77-99",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L77-L99"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "114-115",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L114-L115"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "80-98",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L80-L98"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1153-1163",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1153-L1163"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1192-1203",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1192-L1203"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/fm6_store.c",
     "lines": "148-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/fm6_store.c#L148-L156"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/eng_fm6.c",
     "lines": "201-214",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L201-L214"
    }
   ]
  },
  {
   "round": 2,
   "error": "2: project and template downgrade compatibility",
   "fixed": "Added the v1.3.2 project/template incompatibility, automatic conversion paths and OLD FORMAT protection; kept v1.4.0 compatibility unverified.",
   "at": "switching_note.going_back",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "18-27",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L18-L27"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/pattern_store.c",
     "lines": "42-47",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/pattern_store.c#L42-L47"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "485-516",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L485-L516"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "561-579",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L561-L579"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "703-727",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "610-624",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L624"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "801-815",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L801-L815"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "846-865",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L846-L865"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "890-904",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L890-L904"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "1146-1188",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L1146-L1188"
    }
   ]
  },
  {
   "round": 2,
   "error": "2: project and template downgrade compatibility",
   "fixed": "Named project and template incompatibility with v1.3.2, automatic conversion and protection without changing the generated suffix.",
   "at": "switching_note.lost",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "18-27",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L18-L27"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/pattern_store.c",
     "lines": "42-47",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/pattern_store.c#L42-L47"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "485-516",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L485-L516"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "561-579",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L561-L579"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "703-727",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "610-624",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L624"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "801-815",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L801-L815"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "846-865",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L846-L865"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "890-904",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L890-L904"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "1146-1188",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L1146-L1188"
    }
   ]
  },
  {
   "round": 2,
   "error": "2: project and template downgrade compatibility",
   "fixed": "Replaced - **Updating or going back.** The current editor reads preceding complete backups, but older firmware cannot read the shared preset format. Keep a backup from before conversion if you may downgrade. Projects and templates keep their track count; older formats load with four tracks. Early PROPHET banks at 0x89000 are still ignored. with - **Updating or going back.** The current editor reads preceding complete backups. The supplied v1.3.2 cannot read v1.4.1 shared preset banks, FUN22 projects or the TPLL template. With autosave on, merely loading an older project can rewrite it as FUN22 after 5 seconds stopped and idle. Normal first startup converts a supported v1.3.x template to TPLL during the settings repair. Back up with the previous firmware before updating if you may return. In v1.3.2 these projects show OLD FORMAT and are protected; the unreadable template is protected too. Compatibility with v1.4.0 was not checked. Projects and templates keep their track count; older formats load with four tracks. Early PROPHET banks at 0x89000 are still ignored.",
   "at": "control-maps/melodee.md:Updating or going back",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "18-27",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L18-L27"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/pattern_store.c",
     "lines": "42-47",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/pattern_store.c#L42-L47"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "485-516",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L485-L516"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "561-579",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L561-L579"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "703-727",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "610-624",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L624"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "801-815",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L801-L815"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "846-865",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L846-L865"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "890-904",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L890-L904"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "1146-1188",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L1146-L1188"
    }
   ]
  },
  {
   "round": 2,
   "error": "2: project and template downgrade compatibility",
   "fixed": "Recorded boot-time template format conversion and v1.3.2 downgrade protection.",
   "at": "refresh/work/melodee.storage.json:changes[0]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "801-815",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L801-L815"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "846-865",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L846-L865"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "890-904",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L890-L904"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "1146-1188",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L1146-L1188"
    }
   ]
  },
  {
   "round": 2,
   "error": "1: Store Init runs immediately; 2: project and template downgrade compatibility",
   "fixed": "Recorded immediate Store Init persistence and automatic project conversion with the v1.3.2 downgrade consequence.",
   "at": "refresh/work/melodee.storage.json:changes[13]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "18-27",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L18-L27"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/pattern_store.c",
     "lines": "42-47",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/pattern_store.c#L42-L47"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "485-516",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L485-L516"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "561-579",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L561-L579"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "703-727",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "610-624",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L624"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "77-99",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L77-L99"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "114-115",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L114-L115"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "80-98",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L80-L98"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1153-1163",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1153-L1163"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1192-1203",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1192-L1203"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/fm6_store.c",
     "lines": "148-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/fm6_store.c#L148-L156"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/eng_fm6.c",
     "lines": "201-214",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L201-L214"
    }
   ]
  },
  {
   "round": 2,
   "error": "1: Store Init runs immediately; 2: project and template downgrade compatibility",
   "fixed": "Recorded immediate Store Init persistence and automatic project conversion with the v1.3.2 downgrade consequence.",
   "at": "refresh/work/melodee.storage.json:changes[14]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "18-27",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L18-L27"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/pattern_store.c",
     "lines": "42-47",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/pattern_store.c#L42-L47"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "485-516",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L485-L516"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "561-579",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L561-L579"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "703-727",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "610-624",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L624"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "77-99",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L77-L99"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "114-115",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L114-L115"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "80-98",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L80-L98"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1153-1163",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1153-L1163"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1192-1203",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1192-L1203"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/fm6_store.c",
     "lines": "148-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/fm6_store.c#L148-L156"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/eng_fm6.c",
     "lines": "201-214",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L201-L214"
    }
   ]
  },
  {
   "round": 2,
   "error": "1: Store Init runs immediately; 2: project and template downgrade compatibility",
   "fixed": "Recorded immediate Store Init persistence and automatic project conversion with the v1.3.2 downgrade consequence.",
   "at": "refresh/work/melodee.storage.json:changes[15]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "18-27",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L18-L27"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/pattern_store.c",
     "lines": "42-47",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/pattern_store.c#L42-L47"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "485-516",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L485-L516"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "561-579",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L561-L579"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "703-727",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "610-624",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L624"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "77-99",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L77-L99"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "114-115",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L114-L115"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "80-98",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L80-L98"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1153-1163",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1153-L1163"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1192-1203",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1192-L1203"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/fm6_store.c",
     "lines": "148-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/fm6_store.c#L148-L156"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/eng_fm6.c",
     "lines": "201-214",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L201-L214"
    }
   ]
  },
  {
   "round": 2,
   "error": "1: Store Init runs immediately; 2: project and template downgrade compatibility",
   "fixed": "Recorded immediate Store Init persistence and automatic project conversion with the v1.3.2 downgrade consequence.",
   "at": "refresh/work/melodee.storage.json:changes[16]",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "18-27",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L18-L27"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/pattern_store.c",
     "lines": "42-47",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/pattern_store.c#L42-L47"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "485-516",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L485-L516"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "561-579",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L561-L579"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "703-727",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L703-L727"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/project.c",
     "lines": "610-624",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/project.c#L610-L624"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "77-99",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L77-L99"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_slots.c",
     "lines": "114-115",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_slots.c#L114-L115"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "352-370",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L352-L370"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_popup.c",
     "lines": "80-98",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_popup.c#L80-L98"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1153-1163",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1153-L1163"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/ui_input.c",
     "lines": "1192-1203",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/ui_input.c#L1192-L1203"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/fm6_store.c",
     "lines": "148-156",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/fm6_store.c#L148-L156"
    },
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "firmware/src/eng_fm6.c",
     "lines": "201-214",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/firmware/src/eng_fm6.c#L201-L214"
    }
   ]
  },
  {
   "round": 2,
   "error": "3: copied wording in guide",
   "fixed": "Replaced **Hold GLO or SCL for a quick layer** with **GLO and SCL open shortcut layers when held**",
   "at": "control-maps/melodee.md:GLO/SCL hold",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "web/manual/index.html",
     "lines": "159-165",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/manual/index.html#L159-L165"
    }
   ]
  },
  {
   "round": 2,
   "error": "3: copied wording in guide",
   "fixed": "Replaced Eight patterns for each track in use. KNOB 1-4 queue each track's pattern. with The active tracks each have eight pattern choices. Turn KNOB 1-4 to queue a pattern on the corresponding track.",
   "at": "control-maps/melodee.md:PATTERNS row",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "web/manual/index.html",
     "lines": "710-719",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/web/manual/index.html#L710-L719"
    }
   ]
  },
  {
   "round": 2,
   "error": "3: copied wording in guide",
   "fixed": "Replaced Hold SEQ and turn KNOB 2 to clear the lane or KNOB 4 to delete the point. with With SEQ held, KNOB 2 clears the selected lane; KNOB 4 removes the chosen point.",
   "at": "control-maps/melodee.md:MOTION row",
   "source": [
    {
     "kind": "source",
     "repo": "keremimo/melodee",
     "ref": "v1.4.1",
     "commit": "1cccd6970e6e60f136862f3016de58617010c01e",
     "path": "README.md",
     "lines": "478-486",
     "url": "https://github.com/keremimo/melodee/blob/1cccd6970e6e60f136862f3016de58617010c01e/README.md#L478-L486"
    }
   ]
  },
  {
   "round": 2,
   "error": "typo: sentence capitalization",
   "fixed": "Capitalized the sentence beginning Double-tap/Double-tapping.",
   "at": "controls.button_seq[2]"
  },
  {
   "round": 2,
   "error": "typo: sentence capitalization",
   "fixed": "Capitalized the sentence beginning Double-tap/Double-tapping.",
   "at": "modes[33]"
  },
  {
   "round": 2,
   "error": "typo: double space",
   "fixed": "Replaced template;  startup with template; startup",
   "at": "control-maps/melodee.md:No question"
  },
  {
   "round": 3,
   "error": "Stale atlas-step sentence",
   "fixed": "Removed the stale instruction to update the generated atlas block; no matching sentence was present in the JSON.",
   "at": "control-maps/melodee.md:207"
  }
 ],
 "checker_disputes_refresh": []
}