{
 "firmware": "GHOULBOX",
 "slug": "ghoulbox",
 "author": "Jason Persinger; Felucca foundation: Leo Kuroshita / Hügelton Instruments",
 "repo": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth",
 "licence": "GPL-3.0-only",
 "closed_source": false,
 "mapped_release": "ghoulbox-v2.1",
 "mapped_commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
 "release_date": "2026-10-12",
 "date_mapped": "2026-10-16",
 "turns_it_into": "A four-track instrument for dark ambient music, with medieval sounds, drones, patterns and songs.",
 "docs": [
  {
   "title": "GHOULBOX 2.1 user guide (HTML source of the release PDF)",
   "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/docs/guide/guide.html",
   "path": "docs/guide/guide.html",
   "ref": "ghoulbox-v2.1",
   "commit": "eaf04bdc67baed36113cd1e71636e7e059299086"
  },
  {
   "title": "GHOULBOX 2.1 PDF guide",
   "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/docs/guide/GHOULBOX-User-Guide-2.1.pdf"
  },
  {
   "title": "README",
   "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/README.md",
   "ref": "ghoulbox-v2.1",
   "commit": "eaf04bdc67baed36113cd1e71636e7e059299086"
  }
 ],
 "install": {
  "official": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/releases/tag/ghoulbox-v2.1",
  "hub": "https://thefirmwarehub.com/"
 },
 "part_id_notes": "The printed SEL button is SCL in GHOULBOX; button_sel represents it here. Button lights use lights.button_*; the two PLAY lights share button_play_stop with a light field. The 27 key lights are groups.key_lights. ALGORITHM selects tracks, PRESETS usually selects sounds, and none of the seven encoders has a push gesture. Calibration can change the button/encoder wiring map.",
 "modes": [
  {
   "id": "home",
   "name": "HOME",
   "how_to_get_there": "Tap HOME from another page.",
   "what_it_is": "The selected sound and its four main values, with a scope or track overview.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "624-649",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L624-L649"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_graph.c",
     "lines": "2185-2199",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2199"
    }
   ]
  },
  {
   "id": "step_roll",
   "name": "STEP: melodic",
   "how_to_get_there": "Tap SEQ on a melodic track.",
   "what_it_is": "A piano roll with a step cursor.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "491-495",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L491-L495"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "460-462",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L460-L462"
    }
   ]
  },
  {
   "id": "step_record",
   "name": "STEP: armed and stopped",
   "how_to_get_there": "Open melodic STEP and tap REC while stopped.",
   "what_it_is": "Keys write the cursor step only while this track is armed and the transport is stopped.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "541-569",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L541-L569"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "1658-1671",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1658-L1671"
    }
   ]
  },
  {
   "id": "step_grid",
   "name": "STEP: drums",
   "how_to_get_there": "Tap SEQ on a DRUM track.",
   "what_it_is": "Sixteen step keys, eight lane keys, ACC and two page keys.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "495-505",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L495-L505"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "623-658",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
    }
   ]
  },
  {
   "id": "automation",
   "name": "AUTOMATION",
   "how_to_get_there": "Tap SEQ again from STEP.",
   "what_it_is": "Rows for playback, quantization, locks, recorded moves and step timing.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_events.c",
     "lines": "140-157",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L140-L157"
    }
   ]
  },
  {
   "id": "name",
   "name": "NAME",
   "how_to_get_there": "Choose SAVE or rename on USER or PROJECT.",
   "what_it_is": "A name editor with alphabet and number keys; OCT+ writes and OCT- cancels.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_name.c",
     "lines": "208-260",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L208-L260"
    }
   ]
  },
  {
   "id": "dialog",
   "name": "Confirmation",
   "how_to_get_there": "Choose an action that asks before replacing or clearing work.",
   "what_it_is": "OCT+ accepts and OCT- cancels the displayed action.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "1542-1592",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1542-L1592"
    }
   ]
  },
  {
   "id": "menu",
   "name": "MENU",
   "how_to_get_there": "Hold HOME longer than 0.7 seconds.",
   "what_it_is": "Five tabs for display, control, audio, MIDI and system options.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "1134-1151",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1134-L1151"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "1502-1524",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1502-L1524"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_menu.c",
     "lines": "490-545",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L490-L545"
    }
   ]
  },
  {
   "id": "about",
   "name": "ABOUT",
   "how_to_get_there": "MENU > SYSTEM > ABOUT, then OCT+.",
   "what_it_is": "Version, licensing and credits with a scroll position.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_menu.c",
     "lines": "435-453",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L435-L453"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_menu.c",
     "lines": "512-518",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
    }
   ]
  },
  {
   "id": "info",
   "name": "INFO",
   "how_to_get_there": "MENU > SYSTEM > INFO, then OCT+.",
   "what_it_is": "Firmware, USB and processor information.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_menu.c",
     "lines": "423-433",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L423-L433"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_menu.c",
     "lines": "538-541",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L538-L541"
    }
   ]
  },
  {
   "id": "calibration",
   "name": "Hardware calibration",
   "how_to_get_there": "MENU > SYSTEM > HARDWARE CALIBRATION, then OCT+; or hold both OCT buttons at power-on.",
   "what_it_is": "Teaches the wiring and direction of the fourteen buttons and seven encoders.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "1759-1818",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1759-L1818"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/main.c",
     "lines": "169-172",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/main.c#L169-L172"
    }
   ]
  },
  {
   "id": "sleep",
   "name": "Screen asleep",
   "how_to_get_there": "Enable SCREEN OFF and wait without panel input.",
   "what_it_is": "Sound continues while the display sleeps; the first key, button or encoder movement only wakes it.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "197-210",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L197-L210"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "250-271",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
    }
   ]
  },
  {
   "id": "update",
   "name": "Update mode",
   "how_to_get_there": "Hold OCT- and OCT+ together for more than five seconds.",
   "what_it_is": "A countdown begins after two seconds, then UBOOT waits for the installer.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/main.c",
     "lines": "196-222",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/main.c#L196-L222"
    }
   ]
  },
  {
   "id": "rescue",
   "name": "USB rescue",
   "how_to_get_there": "Hold OCT- alone at power-on, or reach two failed starts.",
   "what_it_is": "USB recovery without the normal sound engine or pages.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/main.c",
     "lines": "282-307",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/main.c#L282-L307"
    }
   ]
  },
  {
   "id": "layer_fx",
   "name": "FX quick layer",
   "how_to_get_there": "Hold FX until the map opens, or use a key/knob while holding it; double-tap to lock it open.",
   "what_it_is": "Keys and KNOB 1–4 follow the map until it closes; locked layers use the same map.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_layer.c",
     "lines": "58-71",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L58-L71"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_layer.c",
     "lines": "257-281",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
    }
   ]
  },
  {
   "id": "layer_glo",
   "name": "GLO quick layer",
   "how_to_get_there": "Hold GLO until the map opens, or use a key/knob while holding it; double-tap to lock it open.",
   "what_it_is": "Keys and KNOB 1–4 follow the map until it closes; locked layers use the same map.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_layer.c",
     "lines": "58-71",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L58-L71"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_layer.c",
     "lines": "257-281",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
    }
   ]
  },
  {
   "id": "layer_scl",
   "name": "SEL quick layer",
   "how_to_get_there": "Hold SEL until the map opens, or use a key/knob while holding it; double-tap to lock it open.",
   "what_it_is": "Keys and KNOB 1–4 follow the map until it closes; locked layers use the same map.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_layer.c",
     "lines": "58-71",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L58-L71"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_layer.c",
     "lines": "257-281",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
    }
   ]
  },
  {
   "id": "layer_edit",
   "name": "EDIT quick layer",
   "how_to_get_there": "Hold EDIT until the map opens, or use a key/knob while holding it; double-tap to lock it open.",
   "what_it_is": "Keys and KNOB 1–4 follow the map until it closes; locked layers use the same map.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_layer.c",
     "lines": "58-71",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L58-L71"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_layer.c",
     "lines": "257-281",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
    }
   ]
  },
  {
   "id": "layer_seq",
   "name": "SEQ quick layer",
   "how_to_get_there": "Hold SEQ until the map opens, or use a key/knob while holding it; double-tap to lock it open.",
   "what_it_is": "Keys and KNOB 1–4 follow the map until it closes; locked layers use the same map.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_layer.c",
     "lines": "58-71",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L58-L71"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_layer.c",
     "lines": "257-281",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
    }
   ]
  },
  {
   "id": "layer_rec",
   "name": "REC quick layer",
   "how_to_get_there": "Hold REC until the map opens, or use a key or knob while holding REC; a double-tap locks it only if the first tap changes arming, which an active or waiting song chain and SONG with this track unarmed prevent.",
   "what_it_is": "Keys and KNOB 1–4 follow the map until it closes; locked layers use the same map.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_layer.c",
     "lines": "58-71",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L58-L71"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_layer.c",
     "lines": "257-281",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_layer.c",
     "lines": "306-332",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L306-L332"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "545-554",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L545-L554"
    }
   ]
  },
  {
   "id": "gurdy_crank",
   "name": "GURDY crank",
   "how_to_get_there": "Set a GURDY track’s COUP to CRANK.",
   "what_it_is": "SELECT drives the shared wheel even when another track is selected.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_gurdy.c",
     "lines": "43-83",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L43-L83"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "1381-1401",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1381-L1401"
    }
   ]
  },
  {
   "id": "env",
   "name": "ENV",
   "how_to_get_there": "Tap ENV.",
   "what_it_is": "Edits the selected track envelope.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "419-420",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L419-L420"
    }
   ]
  },
  {
   "id": "env_dest",
   "name": "ENV DEST",
   "how_to_get_there": "Tap ENV again.",
   "what_it_is": "Routes the envelope to the sound.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "420-421",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L420-L421"
    }
   ]
  },
  {
   "id": "lfo",
   "name": "LFO",
   "how_to_get_there": "Tap LFO.",
   "what_it_is": "Sets the selected track modulation oscillator.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "421-422",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L421-L422"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_draw.c",
     "lines": "1174-1178",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1174-L1178"
    }
   ]
  },
  {
   "id": "lfo_2",
   "name": "LFO 2",
   "how_to_get_there": "Tap LFO again.",
   "what_it_is": "Sets LFO sync and retrigger behavior.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "422-423",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L422-L423"
    }
   ]
  },
  {
   "id": "lfo_dest",
   "name": "LFO DEST",
   "how_to_get_there": "Keep tapping LFO.",
   "what_it_is": "Sets the LFO destination amounts.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "423-424",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L423-L424"
    }
   ]
  },
  {
   "id": "mod",
   "name": "MOD",
   "how_to_get_there": "Keep tapping LFO.",
   "what_it_is": "Edits four modulation routes.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "424-425",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L424-L425"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "487-490",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L487-L490"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_draw.c",
     "lines": "1079-1089",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1079-L1089"
    }
   ]
  },
  {
   "id": "fx",
   "name": "FX",
   "how_to_get_there": "Tap FX.",
   "what_it_is": "Sets the selected track effect amounts.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "425-426",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L425-L426"
    }
   ]
  },
  {
   "id": "slicer",
   "name": "SLICER",
   "how_to_get_there": "Tap FX again.",
   "what_it_is": "Sets the track rhythmic effect.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "426-427",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L426-L427"
    }
   ]
  },
  {
   "id": "delay",
   "name": "DLY",
   "how_to_get_there": "Keep tapping FX.",
   "what_it_is": "Edits the shared delay.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "427-428",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L427-L428"
    }
   ]
  },
  {
   "id": "reverb",
   "name": "REVERB",
   "how_to_get_there": "Keep tapping FX.",
   "what_it_is": "Edits the shared reverb.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "428-429",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L428-L429"
    }
   ]
  },
  {
   "id": "chorus",
   "name": "CHORUS",
   "how_to_get_there": "Keep tapping FX.",
   "what_it_is": "Edits the shared chorus.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "429-430",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L429-L430"
    }
   ]
  },
  {
   "id": "tape",
   "name": "TAPE",
   "how_to_get_there": "Keep tapping FX.",
   "what_it_is": "Adds cassette wear, digital degradation, and ambience.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "430-431",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L430-L431"
    }
   ]
  },
  {
   "id": "scale",
   "name": "SCL",
   "how_to_get_there": "Tap SCL.",
   "what_it_is": "Sets scale mapping for the selected track.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "431-432",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L431-L432"
    }
   ]
  },
  {
   "id": "chord",
   "name": "CHORD",
   "how_to_get_there": "Tap SCL again.",
   "what_it_is": "Sets one-key chords and tuning temperament.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "432-433",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L432-L433"
    }
   ]
  },
  {
   "id": "lanes",
   "name": "LANES",
   "how_to_get_there": "On a DRUM track, keep tapping EDIT.",
   "what_it_is": "Sets the first four drum lane levels.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "436-437",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L436-L437"
    }
   ]
  },
  {
   "id": "lanes_2",
   "name": "LANES 2",
   "how_to_get_there": "On a DRUM track, tap EDIT after LANES.",
   "what_it_is": "Sets the last four drum lane levels.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "437-438",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L437-L438"
    }
   ]
  },
  {
   "id": "voice",
   "name": "VOICE",
   "how_to_get_there": "Keep tapping EDIT.",
   "what_it_is": "Sets note allocation behavior.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "447-448",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L447-L448"
    }
   ]
  },
  {
   "id": "voice_2",
   "name": "VOICE 2",
   "how_to_get_there": "Tap EDIT after VOICE.",
   "what_it_is": "Sets allocation, detuning, pan, and mute.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "448-449",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
    }
   ]
  },
  {
   "id": "voice_3",
   "name": "VOICE 3",
   "how_to_get_there": "Tap EDIT after VOICE 2.",
   "what_it_is": "Sets stereo spread between voices.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "449-450",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L449-L450"
    }
   ]
  },
  {
   "id": "song",
   "name": "SONG",
   "how_to_get_there": "Tap GLO.",
   "what_it_is": "Arranges saved projects as per-track song sections.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "451-452",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L451-L452"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_draw.c",
     "lines": "897-913",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L897-L913"
    }
   ]
  },
  {
   "id": "presets",
   "name": "PRESETS",
   "how_to_get_there": "Press SAVE to USER, then cycle SAVE through PHRASES, PROJECT and TOOLS.",
   "what_it_is": "Browses factory and user sounds.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "452-453",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L452-L453"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_draw.c",
     "lines": "1012-1023",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1012-L1023"
    }
   ]
  },
  {
   "id": "user",
   "name": "USER",
   "how_to_get_there": "Tap SAVE from another page family.",
   "what_it_is": "Loads, erases, or saves one user sound.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "453-454",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L453-L454"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_draw.c",
     "lines": "1035-1042",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1035-L1042"
    }
   ]
  },
  {
   "id": "phrases",
   "name": "PHRASES",
   "how_to_get_there": "Tap SAVE after USER.",
   "what_it_is": "Loads a pattern onto the selected track.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "454-455",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L454-L455"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_draw.c",
     "lines": "1025-1033",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1025-L1033"
    }
   ]
  },
  {
   "id": "project",
   "name": "PROJECT",
   "how_to_get_there": "Tap SAVE after PHRASES.",
   "what_it_is": "Loads or saves all tracks and song state.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "456-457",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L456-L457"
    }
   ]
  },
  {
   "id": "tools",
   "name": "TOOLS",
   "how_to_get_there": "Tap SAVE after PROJECT.",
   "what_it_is": "Selects destructive edits for confirmation.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "457-458",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L457-L458"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_draw.c",
     "lines": "991-995",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L991-L995"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_graph.c",
     "lines": "2285-2288",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2285-L2288"
    }
   ]
  },
  {
   "id": "arp",
   "name": "ARP",
   "how_to_get_there": "Tap ARP.",
   "what_it_is": "Sets the selected track arpeggiator.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "458-459",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L458-L459"
    }
   ]
  },
  {
   "id": "arp_2",
   "name": "ARP 2",
   "how_to_get_there": "Tap ARP again.",
   "what_it_is": "Sets the arpeggiator timing and held-note behavior.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "459-460",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L459-L460"
    }
   ]
  },
  {
   "id": "mixer",
   "name": "MIXER",
   "how_to_get_there": "Tap HOME while already on HOME.",
   "what_it_is": "Sets mix controls for the selected track.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "465-466",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L465-L466"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_draw.c",
     "lines": "997-1010",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L997-L1010"
    }
   ]
  },
  {
   "id": "clock",
   "name": "CLOCK",
   "how_to_get_there": "Tap HOME after MIXER.",
   "what_it_is": "Sets the shared clock.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "466-467",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L466-L467"
    }
   ]
  },
  {
   "id": "keys",
   "name": "KEYS",
   "how_to_get_there": "Tap HOME after CLOCK.",
   "what_it_is": "Sets a second keyboard track and split point.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "467-468",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L467-L468"
    }
   ]
  },
  {
   "id": "fm6_operator",
   "name": "OPERATOR",
   "how_to_get_there": "On an FM6 track, keep tapping EDIT.",
   "what_it_is": "Edits the selected track own FM6 patch.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "439-440",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L439-L440"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_fm6op.c",
     "lines": "124-190",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
    }
   ]
  },
  {
   "id": "fm6_op_env",
   "name": "OP ENV",
   "how_to_get_there": "On an FM6 track, keep tapping EDIT.",
   "what_it_is": "Edits the selected track own FM6 patch.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "440-441",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L440-L441"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_fm6op.c",
     "lines": "124-190",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
    }
   ]
  },
  {
   "id": "fm6_operator_2",
   "name": "OPERATOR 2",
   "how_to_get_there": "On an FM6 track, keep tapping EDIT.",
   "what_it_is": "Edits the selected track own FM6 patch.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "441-442",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L441-L442"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_fm6op.c",
     "lines": "124-190",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
    }
   ]
  },
  {
   "id": "slices",
   "name": "SLICES",
   "how_to_get_there": "Load an existing SLICE track, then keep tapping EDIT.",
   "what_it_is": "Edits slice boundaries in a user sample.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "438-439",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L438-L439"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_slice.c",
     "lines": "78-123",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L78-L123"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_draw.c",
     "lines": "1044-1062",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1044-L1062"
    }
   ]
  },
  {
   "id": "analog_edit_1",
   "name": "OSC",
   "how_to_get_there": "On a ANALOG track, tap EDIT.",
   "what_it_is": "Edits the ANALOG engine first parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_analog.c",
     "lines": "192-201",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L192-L201"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "analog_edit_2",
   "name": "FLT",
   "how_to_get_there": "On a ANALOG track, tap EDIT again.",
   "what_it_is": "Edits the ANALOG engine second parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_analog.c",
     "lines": "192-201",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L192-L201"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "home_analog",
   "name": "HOME · ANALOG",
   "how_to_get_there": "Select a ANALOG sound and return HOME.",
   "what_it_is": "Edits the ANALOG engine main parameters.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "1517-1523",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
    }
   ]
  },
  {
   "id": "fm6_edit_1",
   "name": "OPS",
   "how_to_get_there": "On a FM6 track, tap EDIT.",
   "what_it_is": "Edits the FM6 engine first parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_fm6.c",
     "lines": "433-442",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L433-L442"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "fm6_edit_2",
   "name": "PATCH",
   "how_to_get_there": "On a FM6 track, tap EDIT again.",
   "what_it_is": "Edits the FM6 engine second parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_fm6.c",
     "lines": "433-442",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L433-L442"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "home_fm6",
   "name": "HOME · FM6",
   "how_to_get_there": "Select a FM6 sound and return HOME.",
   "what_it_is": "Edits the FM6 engine main parameters.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "1517-1523",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
    }
   ]
  },
  {
   "id": "phase_edit_1",
   "name": "PHS",
   "how_to_get_there": "On a PHASE track, tap EDIT.",
   "what_it_is": "Edits the PHASE engine first parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phase.c",
     "lines": "189-198",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L189-L198"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "phase_edit_2",
   "name": "LINE",
   "how_to_get_there": "On a PHASE track, tap EDIT again.",
   "what_it_is": "Edits the PHASE engine second parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phase.c",
     "lines": "189-198",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L189-L198"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "home_phase",
   "name": "HOME · PHASE",
   "how_to_get_there": "Select a PHASE sound and return HOME.",
   "what_it_is": "Edits the PHASE engine main parameters.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "1517-1523",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
    }
   ]
  },
  {
   "id": "lofi_edit_1",
   "name": "CHIP",
   "how_to_get_there": "On a LOFI track, tap EDIT.",
   "what_it_is": "Edits the LOFI engine first parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_lofi.c",
     "lines": "225-234",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L225-L234"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "lofi_edit_2",
   "name": "MOTN",
   "how_to_get_there": "On a LOFI track, tap EDIT again.",
   "what_it_is": "Edits the LOFI engine second parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_lofi.c",
     "lines": "225-234",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L225-L234"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "home_lofi",
   "name": "HOME · LOFI",
   "how_to_get_there": "Select a LOFI sound and return HOME.",
   "what_it_is": "Edits the LOFI engine main parameters.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "1517-1523",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
    }
   ]
  },
  {
   "id": "sample_edit_1",
   "name": "SET",
   "how_to_get_there": "On a SAMPLE track, tap EDIT.",
   "what_it_is": "Edits the SAMPLE engine first parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_sample.c",
     "lines": "261-270",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L261-L270"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "sample_edit_2",
   "name": "TONE",
   "how_to_get_there": "On a SAMPLE track, tap EDIT again.",
   "what_it_is": "Edits the SAMPLE engine second parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_sample.c",
     "lines": "261-270",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L261-L270"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "home_sample",
   "name": "HOME · SAMPLE",
   "how_to_get_there": "Select a SAMPLE sound and return HOME.",
   "what_it_is": "Edits the SAMPLE engine main parameters.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "1517-1523",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
    }
   ]
  },
  {
   "id": "voice_edit_1",
   "name": "VOWL",
   "how_to_get_there": "On a VOICE track, tap EDIT.",
   "what_it_is": "Edits the VOICE engine first parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_formant.c",
     "lines": "222-231",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L222-L231"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "voice_edit_2",
   "name": "TONE",
   "how_to_get_there": "On a VOICE track, tap EDIT again.",
   "what_it_is": "Edits the VOICE engine second parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_formant.c",
     "lines": "222-231",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L222-L231"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "home_voice",
   "name": "HOME · VOICE",
   "how_to_get_there": "Select a VOICE sound and return HOME.",
   "what_it_is": "Edits the VOICE engine main parameters.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "1517-1523",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
    }
   ]
  },
  {
   "id": "trio_edit_1",
   "name": "OSC",
   "how_to_get_there": "On a TRIO track, tap EDIT.",
   "what_it_is": "Edits the TRIO engine first parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_trio.c",
     "lines": "364-373",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L364-L373"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "trio_edit_2",
   "name": "TONE",
   "how_to_get_there": "On a TRIO track, tap EDIT again.",
   "what_it_is": "Edits the TRIO engine second parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_trio.c",
     "lines": "364-373",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L364-L373"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "home_trio",
   "name": "HOME · TRIO",
   "how_to_get_there": "Select a TRIO sound and return HOME.",
   "what_it_is": "Edits the TRIO engine main parameters.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "1517-1523",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
    }
   ]
  },
  {
   "id": "wheel_edit_1",
   "name": "BARS",
   "how_to_get_there": "On a WHEEL track, tap EDIT.",
   "what_it_is": "Edits the WHEEL engine first parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_wheel.c",
     "lines": "287-296",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L287-L296"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "wheel_edit_2",
   "name": "TONE",
   "how_to_get_there": "On a WHEEL track, tap EDIT again.",
   "what_it_is": "Edits the WHEEL engine second parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_wheel.c",
     "lines": "287-296",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L287-L296"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "home_wheel",
   "name": "HOME · WHEEL",
   "how_to_get_there": "Select a WHEEL sound and return HOME.",
   "what_it_is": "Edits the WHEEL engine main parameters.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "1517-1523",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
    }
   ]
  },
  {
   "id": "grain_edit_1",
   "name": "GRAN",
   "how_to_get_there": "On a GRAIN track, tap EDIT.",
   "what_it_is": "Edits the GRAIN engine first parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_grain.c",
     "lines": "446-455",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L446-L455"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "grain_edit_2",
   "name": "SPRY",
   "how_to_get_there": "On a GRAIN track, tap EDIT again.",
   "what_it_is": "Edits the GRAIN engine second parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_grain.c",
     "lines": "446-455",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L446-L455"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "home_grain",
   "name": "HOME · GRAIN",
   "how_to_get_there": "Select a GRAIN sound and return HOME.",
   "what_it_is": "Edits the GRAIN engine main parameters.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "1517-1523",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
    }
   ]
  },
  {
   "id": "phys_edit_1",
   "name": "BODY",
   "how_to_get_there": "On a PHYS track, tap EDIT.",
   "what_it_is": "Edits the PHYS engine first parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "240-249",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L240-L249"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "phys_edit_2",
   "name": "EXCT",
   "how_to_get_there": "On a PHYS track, tap EDIT again.",
   "what_it_is": "Edits the PHYS engine second parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "240-249",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L240-L249"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "home_phys",
   "name": "HOME · PHYS",
   "how_to_get_there": "Select a PHYS sound and return HOME.",
   "what_it_is": "Edits the PHYS engine main parameters.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "1517-1523",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
    }
   ]
  },
  {
   "id": "gurdy_edit_1",
   "name": "DRONE",
   "how_to_get_there": "On a GURDY track, tap EDIT.",
   "what_it_is": "Edits the GURDY engine first parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_gurdy.c",
     "lines": "220-229",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L220-L229"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "gurdy_edit_2",
   "name": "WHEEL",
   "how_to_get_there": "On a GURDY track, tap EDIT again.",
   "what_it_is": "Edits the GURDY engine second parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_gurdy.c",
     "lines": "220-229",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L220-L229"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "home_gurdy",
   "name": "HOME · GURDY",
   "how_to_get_there": "Select a GURDY sound and return HOME.",
   "what_it_is": "Edits the GURDY engine main parameters.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "1517-1523",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
    }
   ]
  },
  {
   "id": "noise_edit_1",
   "name": "SRC",
   "how_to_get_there": "On a NOISE track, tap EDIT.",
   "what_it_is": "Edits the NOISE engine first parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_noise.c",
     "lines": "258-267",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L258-L267"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "noise_edit_2",
   "name": "MOVE",
   "how_to_get_there": "On a NOISE track, tap EDIT again.",
   "what_it_is": "Edits the NOISE engine second parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_noise.c",
     "lines": "258-267",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L258-L267"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "home_noise",
   "name": "HOME · NOISE",
   "how_to_get_there": "Select a NOISE sound and return HOME.",
   "what_it_is": "Edits the NOISE engine main parameters.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "1517-1523",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
    }
   ]
  },
  {
   "id": "drum_edit_1",
   "name": "KIT",
   "how_to_get_there": "On a DRUM track, tap EDIT.",
   "what_it_is": "Edits the DRUM engine first parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_drum.c",
     "lines": "333-342",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L333-L342"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "drum_edit_2",
   "name": "HIT",
   "how_to_get_there": "On a DRUM track, tap EDIT again.",
   "what_it_is": "Edits the DRUM engine second parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_drum.c",
     "lines": "333-342",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L333-L342"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "home_drum",
   "name": "HOME · DRUM",
   "how_to_get_there": "Select a DRUM sound and return HOME.",
   "what_it_is": "Edits the DRUM engine main parameters.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "1517-1523",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
    }
   ]
  },
  {
   "id": "slice_edit_1",
   "name": "SLCE",
   "how_to_get_there": "On a SLICE track, tap EDIT.",
   "what_it_is": "Edits the SLICE engine first parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_slice.c",
     "lines": "628-637",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L628-L637"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "slice_edit_2",
   "name": "PLAY",
   "how_to_get_there": "On a SLICE track, tap EDIT again.",
   "what_it_is": "Edits the SLICE engine second parameter bank.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_slice.c",
     "lines": "628-637",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L628-L637"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "434-435",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
    }
   ]
  },
  {
   "id": "home_slice",
   "name": "HOME · SLICE",
   "how_to_get_there": "Select a SLICE sound and return HOME.",
   "what_it_is": "Edits the SLICE engine main parameters.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "1517-1523",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
    }
   ]
  },
  {
   "id": "analog_edit_1_variant_1",
   "name": "OSC · WAVE is SYNC",
   "how_to_get_there": "On a ANALOG track, tap EDIT. Set WAVE is SYNC.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_analog.c",
     "lines": "5-25",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L5-L25"
    }
   ],
   "inherits": "analog_edit_1"
  },
  {
   "id": "analog_edit_1_variant_2",
   "name": "OSC · WAVE is SUB",
   "how_to_get_there": "On a ANALOG track, tap EDIT. Set WAVE is SUB.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_analog.c",
     "lines": "11-25",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L11-L25"
    }
   ],
   "inherits": "analog_edit_1"
  },
  {
   "id": "lofi_edit_1_variant_3",
   "name": "CHIP · WAVE is WRAM",
   "how_to_get_there": "On a LOFI track, tap EDIT. Set WAVE is WRAM.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_lofi.c",
     "lines": "6-7",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L6-L7"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_lofi.c",
     "lines": "20-21",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L20-L21"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_lofi.c",
     "lines": "47-56",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L47-L56"
    }
   ],
   "inherits": "lofi_edit_1"
  },
  {
   "id": "home_lofi_variant_3",
   "name": "HOME · LOFI · WAVE is WRAM",
   "how_to_get_there": "Select a LOFI sound and return HOME. Set WAVE is WRAM.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_lofi.c",
     "lines": "6-7",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L6-L7"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_lofi.c",
     "lines": "20-21",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L20-L21"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_lofi.c",
     "lines": "47-56",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L47-L56"
    }
   ],
   "inherits": "home_lofi"
  },
  {
   "id": "lofi_edit_1_variant_4",
   "name": "CHIP · CHIP is STEP",
   "how_to_get_there": "On a LOFI track, tap EDIT. Set CHIP is STEP.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_lofi.c",
     "lines": "42-56",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L42-L56"
    }
   ],
   "inherits": "lofi_edit_1"
  },
  {
   "id": "home_lofi_variant_4",
   "name": "HOME · LOFI · CHIP is STEP",
   "how_to_get_there": "Select a LOFI sound and return HOME. Set CHIP is STEP.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_lofi.c",
     "lines": "42-56",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L42-L56"
    }
   ],
   "inherits": "home_lofi"
  },
  {
   "id": "phys_edit_1_variant_5",
   "name": "BODY · MODEL is MEMB",
   "how_to_get_there": "On a PHYS track, tap EDIT. Set MODEL is MEMB.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "18-21",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L18-L21"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "64-76",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
    }
   ],
   "inherits": "phys_edit_1"
  },
  {
   "id": "home_phys_variant_5",
   "name": "HOME · PHYS · MODEL is MEMB",
   "how_to_get_there": "Select a PHYS sound and return HOME. Set MODEL is MEMB.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "18-21",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L18-L21"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "64-76",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
    }
   ],
   "inherits": "home_phys"
  },
  {
   "id": "phys_edit_2_variant_6",
   "name": "EXCT · MODEL is MEMB",
   "how_to_get_there": "On a PHYS track, tap EDIT again. Set MODEL is MEMB.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "18-21",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L18-L21"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "64-76",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
    }
   ],
   "inherits": "phys_edit_2"
  },
  {
   "id": "phys_edit_1_variant_7",
   "name": "BODY · MODEL is SYMP",
   "how_to_get_there": "On a PHYS track, tap EDIT. Set MODEL is SYMP.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "22-25",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L22-L25"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "62-76",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L62-L76"
    }
   ],
   "inherits": "phys_edit_1"
  },
  {
   "id": "home_phys_variant_7",
   "name": "HOME · PHYS · MODEL is SYMP",
   "how_to_get_there": "Select a PHYS sound and return HOME. Set MODEL is SYMP.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "22-25",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L22-L25"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "62-76",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L62-L76"
    }
   ],
   "inherits": "home_phys"
  },
  {
   "id": "phys_edit_2_variant_8",
   "name": "EXCT · MODEL is SYMP",
   "how_to_get_there": "On a PHYS track, tap EDIT again. Set MODEL is SYMP.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "22-25",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L22-L25"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "64-76",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
    }
   ],
   "inherits": "phys_edit_2"
  },
  {
   "id": "home_phys_variant_8",
   "name": "HOME · PHYS · MODEL is SYMP",
   "how_to_get_there": "Select a PHYS sound and return HOME. Set MODEL is SYMP.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "22-25",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L22-L25"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "64-76",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
    }
   ],
   "inherits": "home_phys"
  },
  {
   "id": "phys_edit_2_variant_9",
   "name": "EXCT · MODEL is SYMP",
   "how_to_get_there": "On a PHYS track, tap EDIT again. Set MODEL is SYMP.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "22-25",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L22-L25"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_phys.c",
     "lines": "64-76",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
    }
   ],
   "inherits": "phys_edit_2"
  },
  {
   "id": "noise_edit_2_variant_10",
   "name": "MOVE · MODE is LFSR",
   "how_to_get_there": "On a NOISE track, tap EDIT again. Set MODE is LFSR.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_noise.c",
     "lines": "8-9",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L8-L9"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_noise.c",
     "lines": "20-26",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L20-L26"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_noise.c",
     "lines": "45-52",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L45-L52"
    }
   ],
   "inherits": "noise_edit_2"
  },
  {
   "id": "noise_edit_2_variant_11",
   "name": "MOVE · MODE is META",
   "how_to_get_there": "On a NOISE track, tap EDIT again. Set MODE is META.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_noise.c",
     "lines": "8-9",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L8-L9"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_noise.c",
     "lines": "20-26",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L20-L26"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_noise.c",
     "lines": "45-52",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L45-L52"
    }
   ],
   "inherits": "noise_edit_2"
  },
  {
   "id": "noise_edit_2_variant_12",
   "name": "MOVE · MODE is LFSR or META",
   "how_to_get_there": "On a NOISE track, tap EDIT again. Set MODE is LFSR or META.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_noise.c",
     "lines": "8-14",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L8-L14"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_noise.c",
     "lines": "24-26",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L24-L26"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_noise.c",
     "lines": "45-52",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L45-L52"
    }
   ],
   "inherits": "noise_edit_2"
  },
  {
   "id": "gurdy_edit_1_variant_13",
   "name": "DRONE · COUP is CRANK",
   "how_to_get_there": "On a GURDY track, tap EDIT. Set COUP is CRANK.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_gurdy.c",
     "lines": "12-15",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L12-L15"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_gurdy.c",
     "lines": "210-215",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L210-L215"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_gurdy.c",
     "lines": "76-83",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L76-L83"
    }
   ],
   "inherits": "gurdy_edit_1"
  },
  {
   "id": "home_gurdy_variant_13",
   "name": "HOME · GURDY · COUP is CRANK",
   "how_to_get_there": "Select a GURDY sound and return HOME. Set COUP is CRANK.",
   "what_it_is": "Uses the base page’s other controls with this conditional parameter label.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_gurdy.c",
     "lines": "12-15",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L12-L15"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_gurdy.c",
     "lines": "210-215",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L210-L215"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_gurdy.c",
     "lines": "76-83",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L76-L83"
    }
   ],
   "inherits": "home_gurdy"
  },
  {
   "id": "momentary",
   "name": "Momentary edit",
   "how_to_get_there": "Hold LFO while turning an eligible sound or effects knob.",
   "what_it_is": "Edited values return on release unless OCT+ keeps them.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "62-101",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L62-L101"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "1429-1436",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1429-L1436"
    }
   ]
  },
  {
   "id": "keys_layer",
   "name": "Keyboard LAYER",
   "how_to_get_there": "HOME > KEYS > MODE LAYER.",
   "what_it_is": "Each key plays the selected track and a different second track outside sequencer/key maps.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/seq.c",
     "lines": "710-723",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/seq.c",
     "lines": "784-814",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
    }
   ]
  },
  {
   "id": "keys_split",
   "name": "Keyboard SPLIT",
   "how_to_get_there": "HOME > KEYS > MODE SPLIT.",
   "what_it_is": "Keys below SPLT play the second track and remaining keys play the selected track outside sequencer/key maps.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/seq.c",
     "lines": "710-723",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/seq.c",
     "lines": "784-814",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
    }
   ]
  },
  {
   "id": "scale_white",
   "name": "White-key scale",
   "how_to_get_there": "SEL > SCL > QNT WHITE.",
   "what_it_is": "White keys walk through the scale and black keys are silent unless the engine supplies its own map.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/seq.c",
     "lines": "104-138",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
    }
   ]
  },
  {
   "id": "drum_play",
   "name": "DRUM keyboard",
   "how_to_get_there": "Load a DRUM sound outside the drum grid.",
   "what_it_is": "A chromatic GM percussion map shifted by the global octave.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_drum.c",
     "lines": "74-108",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/eng_drum.c",
     "lines": "315-320",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
    }
   ]
  },
  {
   "id": "drone_play",
   "name": "Drone latch",
   "how_to_get_there": "Hold GLO and toggle a track’s upper black latch key, then play that track with its arp off.",
   "what_it_is": "Held notes persist after release until replaced or stopped; the latch is performance state.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/seq.c",
     "lines": "542-599",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
    }
   ]
  }
 ],
 "controls": {
  "button_env": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens the last ENV page, then cycles ENV and ENV DEST.",
    "short_label": "ENV PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1175-1206",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1175-L1206"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "597-621",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L597-L621"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "418-467",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L418-L467"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without applying the button’s usual action.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "When this button is requested, assigns its physical matrix position to the displayed panel label.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1770-1784",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1770-L1784"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Does nothing while MENU owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1518-1524",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1518-L1524"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "508-545",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L508-L545"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Does nothing while NAME owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1526-1534",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1526-L1534"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "press",
    "action": "Does nothing while the confirmation owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1542-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1542-L1592"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens the last LFO page, then cycles LFO, LFO 2, LFO DEST and MOD.",
    "short_label": "LFO PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1175-1206",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1175-L1206"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "597-621",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L597-L621"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "418-467",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L418-L467"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Makes eligible KNOB 1–4 sound and effects edits temporary until LFO is released, keeping up to eight changed values.",
    "short_label": "MOMENTARY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "62-101",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L62-L101"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "758-775",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L758-L775"
     }
    ]
   },
   {
    "mode": "momentary",
    "gesture": "release",
    "action": "Restores temporary knob values after an LFO-held edit and suppresses the usual LFO page tap.",
    "short_label": "RESTORE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1429-1436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1429-L1436"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1699-1708",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1699-L1708"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without applying the button’s usual action.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "When this button is requested, assigns its physical matrix position to the displayed panel label.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1770-1784",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1770-L1784"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Does nothing while MENU owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1518-1524",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1518-L1524"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "508-545",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L508-L545"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Does nothing while NAME owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1526-1534",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1526-L1534"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "press",
    "action": "Does nothing while the confirmation owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1542-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1542-L1592"
     }
    ]
   }
  ],
  "button_fx": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens the last FX page, then cycles FX, SLICER, DLY, REVERB, CHORUS and TAPE.",
    "short_label": "FX PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1175-1206",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1175-L1206"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "597-621",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L597-L621"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "418-467",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L418-L467"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Opens the FX key map after the configured hold delay, or immediately with a key or KNOB 1–4 combination.",
    "short_label": "FX LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "58-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L58-L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "257-281",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "double_press",
    "action": "Locks the layer open when the second press begins within 300 ms of the first release and both taps remain shorter than the hold delay.",
    "short_label": "FX LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "107-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L107-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "177-221",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L177-L221"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "257-281",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Closes the held map once its keys are released, or closes a locked map after tapping its own button.",
    "short_label": "CLOSE LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "177-195",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L177-L195"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "294-301",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L294-L301"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without applying the button’s usual action.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "When this button is requested, assigns its physical matrix position to the displayed panel label.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1770-1784",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1770-L1784"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Does nothing while MENU owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1518-1524",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1518-L1524"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "508-545",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L508-L545"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Does nothing while NAME owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1526-1534",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1526-L1534"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "press",
    "action": "Does nothing while the confirmation owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1542-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1542-L1592"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens the last scale page, then alternates SCL and CHORD.",
    "short_label": "SCALE PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1175-1206",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1175-L1206"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "597-621",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L597-L621"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "418-467",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L418-L467"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Opens the scale key map after the configured hold delay, or immediately with a key or KNOB 1–4 combination.",
    "short_label": "SCALE LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "58-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L58-L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "257-281",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "double_press",
    "action": "Locks the layer open when the second press begins within 300 ms of the first release and both taps remain shorter than the hold delay.",
    "short_label": "SCALE LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "107-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L107-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "177-221",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L177-L221"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "257-281",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "release",
    "action": "Closes the held map once its keys are released, or closes a locked map after tapping its own button.",
    "short_label": "CLOSE LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "177-195",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L177-L195"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "294-301",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L294-L301"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without applying the button’s usual action.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "When this button is requested, assigns its physical matrix position to the displayed panel label.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1770-1784",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1770-L1784"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Does nothing while MENU owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1518-1524",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1518-L1524"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "508-545",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L508-L545"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Does nothing while NAME owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1526-1534",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1526-L1534"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "press",
    "action": "Does nothing while the confirmation owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1542-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1542-L1592"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens the last EDIT page or advances through the pages available for this engine.",
    "short_label": "SOUND PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1175-1206",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1175-L1206"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "597-621",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L597-L621"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "418-467",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L418-L467"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Erases the cursor step and its locks, then advances one step while song playback is stopped.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1191",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1191"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Erases the cursor step and its locks, then advances one step while song playback is stopped.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1191",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1191"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "release",
    "action": "Deletes a motion record or resets the selected CHANCE, RATCH or NUDGE row to its default.",
    "short_label": "DELETE ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "444-468",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L444-L468"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Opens the EDIT key map after the configured hold delay, or immediately with a key or KNOB 1–4 combination.",
    "short_label": "EDIT LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "58-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L58-L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "257-281",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "double_press",
    "action": "Locks the layer open when the second press begins within 300 ms of the first release and both taps remain shorter than the hold delay.",
    "short_label": "EDIT LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "107-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L107-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "177-221",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L177-L221"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "257-281",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "action": "Closes the held map once its keys are released, or closes a locked map after tapping its own button.",
    "short_label": "CLOSE LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "177-195",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L177-L195"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "294-301",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L294-L301"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx+key_f3",
    "action": "Restores the currently held white FX key’s default assignment.",
    "short_label": "DEFAULT FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-515",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L504-L515"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1482-1483",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1482-L1483"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_f3",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_f3",
    "action": "Clears locks on held steps while keeping their notes and hits, when song playback is stopped.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "release",
    "action": "Opens NAME to rename the selected readable stored slot.",
    "short_label": "RENAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1197-1199",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1197-L1199"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "112-144",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L112-L144"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "release",
    "action": "Opens NAME to rename the selected readable stored slot.",
    "short_label": "RENAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1197-1199",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1197-L1199"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "112-144",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L112-L144"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without applying the button’s usual action.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "When this button is requested, assigns its physical matrix position to the displayed panel label.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1770-1784",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1770-L1784"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Does nothing while MENU owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1518-1524",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1518-L1524"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "508-545",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L508-L545"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Does nothing while NAME owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1526-1534",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1526-L1534"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "press",
    "action": "Does nothing while the confirmation owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1542-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1542-L1592"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx+key_g3",
    "action": "Restores the currently held white FX key’s default assignment.",
    "short_label": "DEFAULT FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-515",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L504-L515"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1482-1483",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1482-L1483"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx+key_a3",
    "action": "Restores the currently held white FX key’s default assignment.",
    "short_label": "DEFAULT FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-515",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L504-L515"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1482-1483",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1482-L1483"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx+key_b3",
    "action": "Restores the currently held white FX key’s default assignment.",
    "short_label": "DEFAULT FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-515",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L504-L515"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1482-1483",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1482-L1483"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx+key_c4",
    "action": "Restores the currently held white FX key’s default assignment.",
    "short_label": "DEFAULT FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-515",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L504-L515"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1482-1483",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1482-L1483"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx+key_d4",
    "action": "Restores the currently held white FX key’s default assignment.",
    "short_label": "DEFAULT FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-515",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L504-L515"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1482-1483",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1482-L1483"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx+key_e4",
    "action": "Restores the currently held white FX key’s default assignment.",
    "short_label": "DEFAULT FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-515",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L504-L515"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1482-1483",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1482-L1483"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx+key_f4",
    "action": "Restores the currently held white FX key’s default assignment.",
    "short_label": "DEFAULT FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-515",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L504-L515"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1482-1483",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1482-L1483"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx+key_g4",
    "action": "Restores the currently held white FX key’s default assignment.",
    "short_label": "DEFAULT FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-515",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L504-L515"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1482-1483",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1482-L1483"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx+key_a4",
    "action": "Restores the currently held white FX key’s default assignment.",
    "short_label": "DEFAULT FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-515",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L504-L515"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1482-1483",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1482-L1483"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx+key_b4",
    "action": "Restores the currently held white FX key’s default assignment.",
    "short_label": "DEFAULT FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-515",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L504-L515"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1482-1483",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1482-L1483"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx+key_c5",
    "action": "Restores the currently held white FX key’s default assignment.",
    "short_label": "DEFAULT FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-515",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L504-L515"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1482-1483",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1482-L1483"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx+key_d5",
    "action": "Restores the currently held white FX key’s default assignment.",
    "short_label": "DEFAULT FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-515",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L504-L515"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1482-1483",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1482-L1483"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx+key_e5",
    "action": "Restores the currently held white FX key’s default assignment.",
    "short_label": "DEFAULT FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-515",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L504-L515"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1482-1483",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1482-L1483"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx+key_f5",
    "action": "Restores the currently held white FX key’s default assignment.",
    "short_label": "DEFAULT FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-515",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L504-L515"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1482-1483",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1482-L1483"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx+key_g5",
    "action": "Restores the currently held white FX key’s default assignment.",
    "short_label": "DEFAULT FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-515",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L504-L515"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1482-1483",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1482-L1483"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_fs3",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_g3",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_gs3",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_a3",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_as3",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_b3",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_c4",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_cs4",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_d4",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_ds4",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_e4",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_f4",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_fs4",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_g4",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_gs4",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_a4",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_as4",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_b4",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_c5",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_cs5",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_d5",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_ds5",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_e5",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_f5",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_fs5",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press_while_holding:key_g5",
    "action": "During armed, stopped melodic entry with a step open, clears that step’s locks while retaining its notes, unless song playback blocks editing.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_g3",
    "action": "Clears locks on held steps while keeping their notes and hits, when song playback is stopped.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_a3",
    "action": "Clears locks on held steps while keeping their notes and hits, when song playback is stopped.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_b3",
    "action": "Clears locks on held steps while keeping their notes and hits, when song playback is stopped.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_c4",
    "action": "Clears locks on held steps while keeping their notes and hits, when song playback is stopped.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_d4",
    "action": "Clears locks on held steps while keeping their notes and hits, when song playback is stopped.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_e4",
    "action": "Clears locks on held steps while keeping their notes and hits, when song playback is stopped.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_f4",
    "action": "Clears locks on held steps while keeping their notes and hits, when song playback is stopped.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_g4",
    "action": "Clears locks on held steps while keeping their notes and hits, when song playback is stopped.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_a4",
    "action": "Clears locks on held steps while keeping their notes and hits, when song playback is stopped.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_b4",
    "action": "Clears locks on held steps while keeping their notes and hits, when song playback is stopped.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_c5",
    "action": "Clears locks on held steps while keeping their notes and hits, when song playback is stopped.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_d5",
    "action": "Clears locks on held steps while keeping their notes and hits, when song playback is stopped.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_e5",
    "action": "Clears locks on held steps while keeping their notes and hits, when song playback is stopped.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_f5",
    "action": "Clears locks on held steps while keeping their notes and hits, when song playback is stopped.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_g5",
    "action": "Clears locks on held steps while keeping their notes and hits, when song playback is stopped.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "729-743",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L729-L743"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1180-1185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1180-L1185"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens SONG to arrange saved patterns by track.",
    "short_label": "SONG PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1175-1206",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1175-L1206"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "597-621",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L597-L621"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "418-467",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L418-L467"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Opens the GLO key map after the configured hold delay, or immediately with a key or KNOB 1–4 combination.",
    "short_label": "GLO LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "58-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L58-L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "257-281",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "double_press",
    "action": "Locks the layer open when the second press begins within 300 ms of the first release and both taps remain shorter than the hold delay.",
    "short_label": "GLO LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "107-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L107-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "177-221",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L177-L221"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "257-281",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "action": "Closes the held map once its keys are released, or closes a locked map after tapping its own button.",
    "short_label": "CLOSE LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "177-195",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L177-L195"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "294-301",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L294-L301"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without applying the button’s usual action.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "When this button is requested, assigns its physical matrix position to the displayed panel label.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1770-1784",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1770-L1784"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Does nothing while MENU owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1518-1524",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1518-L1524"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "508-545",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L508-L545"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Does nothing while NAME owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1526-1534",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1526-L1534"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "press",
    "action": "Does nothing while the confirmation owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1542-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1542-L1592"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens the last SEQ page or alternates STEP and AUTOMATION.",
    "short_label": "SEQ PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1175-1206",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1175-L1206"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "597-621",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L597-L621"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "418-467",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L418-L467"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Opens the SEQ key map after the configured hold delay, or immediately with a key or KNOB 1–4 combination.",
    "short_label": "SEQ LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "58-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L58-L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "257-281",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "double_press",
    "action": "Locks the layer open when the second press begins within 300 ms of the first release and both taps remain shorter than the hold delay.",
    "short_label": "SEQ LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "107-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L107-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "177-221",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L177-L221"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "257-281",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "action": "Closes the held map once its keys are released, or closes a locked map after tapping its own button.",
    "short_label": "CLOSE LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "177-195",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L177-L195"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "294-301",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L294-L301"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without applying the button’s usual action.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "When this button is requested, assigns its physical matrix position to the displayed panel label.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1770-1784",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1770-L1784"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Does nothing while MENU owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1518-1524",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1518-L1524"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "508-545",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L508-L545"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Does nothing while NAME owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1526-1534",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1526-L1534"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "press",
    "action": "Does nothing while the confirmation owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1542-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1542-L1592"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens the last arp page, then alternates ARP and ARP 2.",
    "short_label": "ARP PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1175-1206",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1175-L1206"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "597-621",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L597-L621"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "418-467",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L418-L467"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without applying the button’s usual action.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "When this button is requested, assigns its physical matrix position to the displayed panel label.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1770-1784",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1770-L1784"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Does nothing while MENU owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1518-1524",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1518-L1524"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "508-545",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L508-L545"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Does nothing while NAME owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1526-1534",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1526-L1534"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "press",
    "action": "Does nothing while the confirmation owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1542-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1542-L1592"
     }
    ]
   }
  ],
  "button_home": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Returns to HOME from another family, or advances HOME → MIXER → CLOCK → KEYS → HOME.",
    "short_label": "HOME CYCLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "634-649",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L634-L649"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "465-467",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L465-L467"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Opens or closes MENU after more than 0.7 seconds.",
    "short_label": "MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1134-1151",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1134-L1151"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1502-1514",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1502-L1514"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "release",
    "action": "Closes MENU and requests a settings save.",
    "short_label": "CLOSE MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "482-488",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L482-L488"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1502-1504",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1502-L1504"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without applying the button’s usual action.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "When this button is requested, assigns its physical matrix position to the displayed panel label.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1770-1784",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1770-L1784"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Opens USER from another family or advances USER → PHRASES → PROJECT → TOOLS → PRESETS.",
    "short_label": "SAVE PAGES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1536-1541",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1536-L1541"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "597-621",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L597-L621"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "After more than 0.7 seconds, swaps the latest undo copy with the current sound, pattern or automation edit while song playback is stopped.",
    "short_label": "UNDO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1536-1539",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1536-L1539"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "888-957",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L888-L957"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without applying the button’s usual action.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "When this button is requested, assigns its physical matrix position to the displayed panel label.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1770-1784",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1770-L1784"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Does nothing while MENU owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1518-1524",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1518-L1524"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "508-545",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L508-L545"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Does nothing while NAME owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1526-1534",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1526-L1534"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "press",
    "action": "Does nothing while the confirmation owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1542-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1542-L1592"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "any",
    "gesture": "release",
    "action": "Arms or disarms the selected track and starts playback when arming while stopped, except on melodic STEP.",
    "short_label": "RECORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "541-569",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L541-L569"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "While stopped, arms the selected track for cursor-based note entry without starting playback.",
    "short_label": "STEP ARM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "541-569",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L541-L569"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "release",
    "action": "Does nothing in MENU, NAME or a confirmation dialog.",
    "short_label": "NO RECORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1516-1518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1516-L1518"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "hold",
    "action": "Opens the REC key map after the configured hold delay, or immediately with a key or KNOB 1–4 combination.",
    "short_label": "REC LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "58-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L58-L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "257-281",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "double_press",
    "action": "Locks REC when the first tap changes arming and the second begins within 300 ms of release, with both taps shorter than the hold delay; an active or waiting song chain, or SONG with this track unarmed, prevents the lock.",
    "short_label": "REC LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "107-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L107-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "177-221",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L177-L221"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "257-281",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L257-L281"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "306-332",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L306-L332"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "545-554",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L545-L554"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "release",
    "action": "Closes the held map once its keys are released, or closes a locked map after tapping its own button.",
    "short_label": "CLOSE LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "177-195",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L177-L195"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "294-301",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L294-L301"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "release",
    "action": "Can disarm an already armed track but refuses new arming on SONG, asking for SEQ instead.",
    "short_label": "STOP / SEQ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "545-556",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L545-L556"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without applying the button’s usual action.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "When this button is requested, assigns its physical matrix position to the displayed panel label.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1770-1784",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1770-L1784"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Does nothing while NAME owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1526-1534",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1526-L1534"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "press",
    "action": "Does nothing while the confirmation owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1542-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1542-L1592"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Starts the loop or stops playback, waiting song playback or a count-in.",
    "short_label": "PLAY / STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1604-1612",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1604-L1612"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Stops a transport that started during naming without starting a new one.",
    "short_label": "STOP ONLY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1526-1533",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1526-L1533"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "press",
    "action": "Does nothing until the confirmation is answered.",
    "short_label": "WAIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1542-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1542-L1592"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Restarts a playing loop from its beginning with GLO physically held, or starts it if stopped, unless a song is active or external clock blocks restart.",
    "short_label": "RESTART",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "723-734",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L723-L734"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Starts the song from its first section while stopped, or stops it while playing.",
    "short_label": "PLAY SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1604-1612",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1604-L1612"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without applying the button’s usual action.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "When this button is requested, assigns its physical matrix position to the displayed panel label.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1770-1784",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1770-L1784"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Does nothing while MENU owns the panel.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1518-1524",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1518-L1524"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "508-545",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L508-L545"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Moves the keyboard one octave down within −3 to +3 outside answering screens and SET layers.",
    "short_label": "OCT -",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1623-1632",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1623-L1632"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_with:button_oct_up",
    "action": "Resets the octave to zero during normal page use when both OCT buttons are down.",
    "short_label": "OCTAVE ZERO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1623-1632",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1623-L1632"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Holding both OCT buttons for more than five seconds enters UBOOT, with a countdown after two seconds and cancellation on release.",
    "short_label": "UPDATE MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/main.c",
      "lines": "196-222",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/main.c#L196-L222"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "release",
    "action": "Cancels the displayed action.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1542-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1542-L1592"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "power_on_holding:button_oct_down+button_oct_up",
    "action": "Requests hardware calibration at power-on when the physical OCT pair is held.",
    "short_label": "CALIBRATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/main.c",
      "lines": "169-172",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/main.c#L169-L172"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "power_on_holding:button_oct_down",
    "action": "Starts USB rescue when OCT- alone is held at power-on.",
    "short_label": "USB RESCUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/main.c",
      "lines": "282-307",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/main.c#L282-L307"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "action": "Restores this layer’s opening snapshot of mutes, levels and tempo.",
    "short_label": "MIX UNDO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "750-807",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L750-L807"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "release",
    "action": "Restores this layer’s opening snapshot of scale and chord settings.",
    "short_label": "SCALE UNDO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "750-807",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L750-L807"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "action": "Restores this layer’s opening snapshot of the loaded sound and drum lane mutes.",
    "short_label": "SOUND UNDO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "750-807",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L750-L807"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "action": "Restores this layer’s opening snapshot of steps, automation and pattern settings.",
    "short_label": "SEQ UNDO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "750-807",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L750-L807"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "release",
    "action": "Restores this layer’s opening snapshot of steps, automation and recording options.",
    "short_label": "REC UNDO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "750-807",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L750-L807"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "With FX LATCH enabled, turns off every latched effect and resets all four macros.",
    "short_label": "ALL FX OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "749-760",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L749-L760"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "release",
    "action": "Chooses the previous value on a setting row.",
    "short_label": "PREV VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "525-545",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L525-L545"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "release",
    "action": "Returns to the menu tabs.",
    "short_label": "BACK TO MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "release",
    "action": "Returns to the menu tabs.",
    "short_label": "BACK TO MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "release",
    "action": "Returns to HOME.",
    "short_label": "HOME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1645-1651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1645-L1651"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "release",
    "action": "Closes NAME without writing the name or slot.",
    "short_label": "CANCEL NAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "308-311",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L308-L311"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "release",
    "action": "Drops the selected action or returns to HOME when no action is selected, with PHRASES and SONG returning directly to HOME.",
    "short_label": "BACK / HOME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1645-1651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1645-L1651"
     }
    ]
   },
   {
    "mode": "phrases",
    "gesture": "release",
    "action": "Drops the selected action or returns to HOME when no action is selected, with PHRASES and SONG returning directly to HOME.",
    "short_label": "BACK / HOME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1645-1651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1645-L1651"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "release",
    "action": "Drops the selected action or returns to HOME when no action is selected, with PHRASES and SONG returning directly to HOME.",
    "short_label": "BACK / HOME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1645-1651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1645-L1651"
     }
    ]
   },
   {
    "mode": "tools",
    "gesture": "release",
    "action": "Drops the selected action or returns to HOME when no action is selected, with PHRASES and SONG returning directly to HOME.",
    "short_label": "BACK / HOME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1645-1651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1645-L1651"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "release",
    "action": "Drops the selected action or returns to HOME when no action is selected, with PHRASES and SONG returning directly to HOME.",
    "short_label": "BACK / HOME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1645-1651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1645-L1651"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "release",
    "action": "Drops the selected action or returns to HOME when no action is selected, with PHRASES and SONG returning directly to HOME.",
    "short_label": "BACK / HOME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1645-1651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1645-L1651"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without applying the button’s usual action.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "When this button is requested, assigns its physical matrix position to the displayed panel label.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1770-1784",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1770-L1784"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Moves the keyboard one octave up within −3 to +3 outside answering screens and SET layers.",
    "short_label": "OCT +",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1623-1632",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1623-L1632"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_with:button_oct_down",
    "action": "Resets the octave to zero during normal page use when both OCT buttons are down.",
    "short_label": "OCTAVE ZERO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1623-1632",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1623-L1632"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "action": "Holding both OCT buttons for more than five seconds enters UBOOT, with a countdown after two seconds and cancellation on release.",
    "short_label": "UPDATE MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/main.c",
      "lines": "196-222",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/main.c#L196-L222"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "release",
    "action": "Accepts the displayed action.",
    "short_label": "CONFIRM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1542-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1542-L1592"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_lfo",
    "action": "Keeps the temporary values currently changed with LFO held.",
    "short_label": "KEEP EDITS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1429-1436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1429-L1436"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "action": "Does nothing while this SET layer is open.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "737-807",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L737-L807"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "release",
    "action": "Does nothing while this SET layer is open.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "737-807",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L737-L807"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "action": "Does nothing while this SET layer is open.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "737-807",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L737-L807"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "action": "Does nothing while this SET layer is open.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "737-807",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L737-L807"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "release",
    "action": "Does nothing while this SET layer is open.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "737-807",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L737-L807"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "release",
    "action": "Chooses the next setting value or opens CALIBRATION, INFO or ABOUT.",
    "short_label": "NEXT / OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "525-545",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L525-L545"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "release",
    "action": "Does nothing on this information screen.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "release",
    "action": "Does nothing on this information screen.",
    "short_label": "NO ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "release",
    "action": "Adds the selected record on + ADD, swaps LOCK and AUTO on a motion row, or asks to clear motion from PLAY.",
    "short_label": "ADD / KIND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "380-439",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L380-L439"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "release",
    "action": "Writes the named sound or project only while stopped; an FM6 rename can detach its saved patch even when the displayed category stays OTHER.",
    "short_label": "WRITE NAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "244-274",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L244-L274"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "308-311",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L308-L311"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "91-100",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L91-L100"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "221-241",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L221-L241"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "244-265",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L244-L265"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/upreset.c",
      "lines": "102-105",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L102-L105"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/upreset.c",
      "lines": "307-343",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L307-L343"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/upreset.c",
      "lines": "438-448",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L438-L448"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/upreset.c",
      "lines": "570-590",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L570-L590"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/up_fm6.c",
      "lines": "76-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/up_fm6.c#L76-L83"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/up_fm6.c",
      "lines": "117-124",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/up_fm6.c#L117-L124"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/up_fm6.c",
      "lines": "201-213",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/up_fm6.c#L201-L213"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/upreset.c",
      "lines": "72-105",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L72-L105"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/upreset.c",
      "lines": "394",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L394"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/upreset.c",
      "lines": "590",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L590"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/category.c",
      "lines": "7-14",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/category.c#L7-L14"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "release",
    "action": "Performs the picked LOAD, ERASE or SAVE action, asking before erasing or replacing a readable used slot and opening NAME before saving.",
    "short_label": "USER ACTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "953-965",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L953-L965"
     }
    ]
   },
   {
    "mode": "phrases",
    "gesture": "release",
    "action": "Loads the selected phrase into this track, asking first when it would replace edited steps, while song playback is stopped.",
    "short_label": "LOAD PHRASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "938-944",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L938-L944"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "release",
    "action": "Loads the chosen project or opens NAME to save it, asking first before replacing a readable used slot and refusing saves during playback.",
    "short_label": "PROJECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "968-981",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L968-L981"
     }
    ]
   },
   {
    "mode": "tools",
    "gesture": "release",
    "action": "Asks before clearing the selected pattern, initializing its sound, deleting the selected song row or clearing the song.",
    "short_label": "TOOLS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "923-930",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L923-L930"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "release",
    "action": "Starts the song from its beginning or stops it if already playing or waiting.",
    "short_label": "PLAY SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "933-936",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L933-L936"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "release",
    "action": "Splits the selected slice or joins it to the preceding slice, for an editable USR1–3 source with a suitable marker.",
    "short_label": "SLICE EDIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "155-197",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L155-L197"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without applying the button’s usual action.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "When this button is requested, assigns its physical matrix position to the displayed panel label.",
    "short_label": "TEACH BUTTON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1770-1784",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1770-L1784"
     }
    ]
   }
  ],
  "encoder_algorithm": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Selects track 1–4 outside menus, naming, dialogs and quick layers.",
    "short_label": "TRACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1677-1681",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1677-L1681"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Moves between five tabs with wraparound and recalls each tab’s selected row.",
    "short_label": "MENU TAB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "500-506",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L500-L506"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn",
    "action": "Does nothing while a quick layer owns the controls.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1484",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1484"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn",
    "action": "Does nothing while a quick layer owns the controls.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1484",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1484"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "turn",
    "action": "Does nothing while a quick layer owns the controls.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1484",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1484"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "turn",
    "action": "Does nothing while a quick layer owns the controls.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1484",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1484"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn",
    "action": "Does nothing while a quick layer owns the controls.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1484",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1484"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "turn",
    "action": "Does nothing while a quick layer owns the controls.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1484",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1484"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "turn",
    "action": "Wakes the screen without changing a value.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "action": "When this encoder is requested, records its physical position and clockwise direction.",
    "short_label": "TEACH KNOB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1786-1810",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1786-L1810"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "turn",
    "action": "Does nothing on INFO.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "turn",
    "action": "Does nothing on ABOUT.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "turn",
    "action": "Does nothing on NAME.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "304-307",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L304-L307"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "turn",
    "action": "Does nothing while the confirmation is open.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1590-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1590-L1592"
     }
    ]
   }
  ],
  "encoder_select": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Changes the global tempo from 40–240 unless BPM LOCK is on or a GURDY track uses CRANK.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1381-1401",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1381-L1401"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1682-1690",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1682-L1690"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "148",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L148"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_glo",
    "action": "Changes tempo with GLO held even when BPM LOCK or GURDY CRANK would take SELECT.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1485-1486",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1485-L1486"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1682-1689",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1682-L1689"
     }
    ]
   },
   {
    "mode": "gurdy_crank",
    "gesture": "turn",
    "action": "When a GURDY track uses COUP CRANK, turns its wheel in either direction, with speed shaping pressure and a sharp flick exciting its buzz.",
    "short_label": "CRANK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1381-1401",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1381-L1401"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "43-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L43-L83"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Does nothing in MENU, INFO or ABOUT.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "508-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L508-L518"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "521-545",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L521-L545"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "turn",
    "action": "Wakes the screen without changing a value.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "action": "When this encoder is requested, records its physical position and clockwise direction.",
    "short_label": "TEACH KNOB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1786-1810",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1786-L1810"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "turn",
    "action": "Does nothing on INFO.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "turn",
    "action": "Does nothing on ABOUT.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "turn",
    "action": "Does nothing on NAME.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "304-307",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L304-L307"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "turn",
    "action": "Does nothing while the confirmation is open.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1590-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1590-L1592"
     }
    ]
   }
  ],
  "encoder_presets": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Loads a sound from the current list, followed by used user slots, keeping the steps outside cursor and action pages.",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1106-1131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1106-L1131"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "turn",
    "action": "Moves the step cursor and wraps within LEN, optionally sounding its contents with STEP PREVIEW.",
    "short_label": "STEP CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1106-1131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1106-L1131"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "592-597",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L592-L597"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "304-307",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L304-L307"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1590-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1590-L1592"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn",
    "action": "Moves the step cursor and wraps within LEN, optionally sounding its contents with STEP PREVIEW.",
    "short_label": "STEP CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1106-1131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1106-L1131"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "592-597",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L592-L597"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "304-307",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L304-L307"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1590-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1590-L1592"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "turn",
    "action": "Selects the automation row.",
    "short_label": "ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1106-1131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1106-L1131"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "592-597",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L592-L597"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "304-307",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L304-L307"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1590-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1590-L1592"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "turn",
    "action": "Does nothing on NAME.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1106-1131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1106-L1131"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "592-597",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L592-L597"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "304-307",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L304-L307"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1590-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1590-L1592"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "turn",
    "action": "Does nothing while the confirmation is open.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1106-1131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1106-L1131"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "592-597",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L592-L597"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "304-307",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L304-L307"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1590-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1590-L1592"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn_while_holding:button_fx",
    "action": "Cycles the held white key’s effect through NONE and twelve effects, saving the assignment when the layer closes.",
    "short_label": "ASSIGN FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "473-502",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L473-L502"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "158-166",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L158-L166"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_f3",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f3",
    "action": "Moves every held step by −8 to +7 sixteenths of a step, heard only with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Moves between rows of the selected tab with wraparound.",
    "short_label": "MENU ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "494-498",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L494-L498"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "turn",
    "action": "Scrolls the version and credits document.",
    "short_label": "CREDITS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "turn",
    "action": "Selects the user sound slot.",
    "short_label": "USER SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1106-1131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1106-L1131"
     }
    ]
   },
   {
    "mode": "phrases",
    "gesture": "turn",
    "action": "Selects the phrase to load.",
    "short_label": "PHRASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1106-1131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1106-L1131"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "turn",
    "action": "Selects one of four project slots.",
    "short_label": "PROJECT SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1106-1131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1106-L1131"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Selects the song section or + ADD row.",
    "short_label": "SECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1106-1131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1106-L1131"
     }
    ]
   },
   {
    "mode": "tools",
    "gesture": "turn",
    "action": "Does nothing on TOOLS.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1106-1131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1106-L1131"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "turn",
    "action": "Does nothing on SLICES.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1106-1131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1106-L1131"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn",
    "action": "Does nothing while this quick layer owns the controls.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1478-1486",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1478-L1486"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1677-1679",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1677-L1679"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "turn",
    "action": "Does nothing while this quick layer owns the controls.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1478-1486",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1478-L1486"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1677-1679",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1677-L1679"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "turn",
    "action": "Does nothing while this quick layer owns the controls.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1478-1486",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1478-L1486"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1677-1679",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1677-L1679"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn",
    "action": "Does nothing while this quick layer owns the controls.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1478-1486",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1478-L1486"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1677-1679",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1677-L1679"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "turn",
    "action": "Does nothing while this quick layer owns the controls.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1478-1486",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1478-L1486"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1677-1679",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1677-L1679"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "turn",
    "action": "Wakes the screen without changing a value.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "action": "When this encoder is requested, records its physical position and clockwise direction.",
    "short_label": "TEACH KNOB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1786-1810",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1786-L1810"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "turn",
    "action": "Does nothing on INFO.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_fs3",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_g3",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_gs3",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_a3",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_as3",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_b3",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_c4",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_cs4",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_d4",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_ds4",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_e4",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_f4",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_fs4",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_g4",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_gs4",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_a4",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_as4",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_b4",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_c5",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_cs5",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_d5",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_ds5",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_e5",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_f5",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_fs5",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_g5",
    "action": "During armed, stopped melodic entry with a step open, nudges that step from −8 to +7 sixteenths, heard with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "674-678",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L674-L678"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1114-1121",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1114-L1121"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1663-1669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1663-L1669"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_g3",
    "action": "Moves every held step by −8 to +7 sixteenths of a step, heard only with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_a3",
    "action": "Moves every held step by −8 to +7 sixteenths of a step, heard only with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_b3",
    "action": "Moves every held step by −8 to +7 sixteenths of a step, heard only with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_c4",
    "action": "Moves every held step by −8 to +7 sixteenths of a step, heard only with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_d4",
    "action": "Moves every held step by −8 to +7 sixteenths of a step, heard only with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_e4",
    "action": "Moves every held step by −8 to +7 sixteenths of a step, heard only with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f4",
    "action": "Moves every held step by −8 to +7 sixteenths of a step, heard only with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_g4",
    "action": "Moves every held step by −8 to +7 sixteenths of a step, heard only with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_a4",
    "action": "Moves every held step by −8 to +7 sixteenths of a step, heard only with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_b4",
    "action": "Moves every held step by −8 to +7 sixteenths of a step, heard only with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_c5",
    "action": "Moves every held step by −8 to +7 sixteenths of a step, heard only with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_d5",
    "action": "Moves every held step by −8 to +7 sixteenths of a step, heard only with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_e5",
    "action": "Moves every held step by −8 to +7 sixteenths of a step, heard only with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f5",
    "action": "Moves every held step by −8 to +7 sixteenths of a step, heard only with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_g5",
    "action": "Moves every held step by −8 to +7 sixteenths of a step, heard only with QUANTIZE off and no ratchet.",
    "short_label": "NUDGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "90-93",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L90-L93"
     }
    ]
   }
  ],
  "encoder_knob1": [
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_lfo",
    "action": "Temporarily edits this knob’s sound or effects value on eligible value pages, restoring it when LFO is released unless OCT+ keeps it.",
    "short_label": "TEMPORARY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "62-101",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L62-L101"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1429-1436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1429-L1436"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f3",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_f3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn",
    "action": "Sweeps the master filter from low-pass through neutral to high-pass.",
    "short_label": "FILTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "688-695",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L688-L695"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "85-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L85-L89"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn",
    "action": "Changes track 1’s level.",
    "short_label": "T1 LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "696-700",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L696-L700"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "turn",
    "action": "Chooses the track’s root.",
    "short_label": "ROOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "68-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L68-L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "711-719",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L711-L719"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "turn",
    "action": "Chooses a visible engine.",
    "short_label": "ENGINE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "701-707",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L701-L707"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn",
    "action": "Sets the pattern length to 1–64 steps.",
    "short_label": "LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "70-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L70-L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "711-719",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L711-L719"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "turn",
    "action": "Chooses OFF, REC or ON for the click.",
    "short_label": "CLICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "430-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L430-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "708-710",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L708-L710"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Steps the selected setting through its allowed values.",
    "short_label": "MENU VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "525-532",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L525-L532"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "turn",
    "action": "Moves the step cursor with wraparound within LEN.",
    "short_label": "STEP CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "776-809",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L776-L809"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn",
    "action": "Moves the step cursor with wraparound within LEN.",
    "short_label": "STEP CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "610-620",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L610-L620"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "turn",
    "action": "Selects the row in the automation list.",
    "short_label": "ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "258-377",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L258-L377"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "turn",
    "action": "Moves the name cursor.",
    "short_label": "NAME CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "221-241",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L221-L241"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "304-307",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L304-L307"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "turn",
    "action": "Sets the attack time.",
    "short_label": "ENV ATTACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "63",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L63"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "419-420",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L419-L420"
     }
    ],
    "range": "0–127, displayed as time"
   },
   {
    "mode": "env_dest",
    "gesture": "turn",
    "action": "Sets how strongly the envelope moves the filter.",
    "short_label": "ENV FILTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "67",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L67"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "420-421",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L420-L421"
     }
    ],
    "range": "-64–63"
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "action": "Sets the free-running LFO speed.",
    "short_label": "LFO RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "421-422",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L421-L422"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1174-1178",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1174-L1178"
     }
    ],
    "range": "0–127, shown in Hz"
   },
   {
    "mode": "lfo_2",
    "gesture": "turn",
    "action": "Chooses a tempo division or free-running rate.",
    "short_label": "LFO SYNC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "132",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L132"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "422-423",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L422-L423"
     }
    ],
    "range": "OFF, 4BAR, 2BAR, 1/1, 1/2, 1/4, 1/8, 8T, 1/16, 16T, 1/32"
   },
   {
    "mode": "lfo_dest",
    "gesture": "turn",
    "action": "Sets LFO pitch movement.",
    "short_label": "LFO PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "75",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L75"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "423-424",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L423-L424"
     }
    ],
    "range": "-64–63"
   },
   {
    "mode": "mod",
    "gesture": "turn",
    "action": "Chooses the modulation slot.",
    "short_label": "MOD SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "900-902",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L900-L902"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "424-425",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L424-L425"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "487-490",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L487-L490"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1079-1089",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1079-L1089"
     }
    ],
    "range": "1–4"
   },
   {
    "mode": "fx",
    "gesture": "turn",
    "action": "Sets the track distortion amount.",
    "short_label": "DISTORTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "95",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L95"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "425-426",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L425-L426"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "slicer",
    "gesture": "turn",
    "action": "Chooses gating, stutter, or no slicer.",
    "short_label": "SLICER MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "107",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L107"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "426-427",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L426-L427"
     }
    ],
    "range": "OFF, GATE, STUT"
   },
   {
    "mode": "delay",
    "gesture": "turn",
    "action": "Sets the delay time as a tempo division.",
    "short_label": "DELAY TIME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "152",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L152"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "427-428",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L427-L428"
     }
    ],
    "range": "4BAR, 2BAR, 1/1, 1/2, 1/4, 1/8, 8T, 1/16, 16T, 1/32"
   },
   {
    "mode": "reverb",
    "gesture": "turn",
    "action": "Chooses the reverb model.",
    "short_label": "REVERB TYPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "178",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L178"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "428-429",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L428-L429"
     }
    ],
    "range": "ROOM, SPRING, HALL"
   },
   {
    "mode": "chorus",
    "gesture": "turn",
    "action": "Sets the chorus rate.",
    "short_label": "CHORUS RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "158",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L158"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "429-430",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L429-L430"
     }
    ],
    "range": "0–127, displayed in Hz"
   },
   {
    "mode": "tape",
    "gesture": "turn",
    "action": "Sets cassette wear across the mix.",
    "short_label": "TAPE WEAR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "182",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L182"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "430-431",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L430-L431"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "scale",
    "gesture": "turn",
    "action": "Sets the scale root.",
    "short_label": "ROOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "87",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L87"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "431-432",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L431-L432"
     }
    ],
    "range": "C–B"
   },
   {
    "mode": "chord",
    "gesture": "turn",
    "action": "Chooses the chord built from each key.",
    "short_label": "CHORD TYPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "125",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L125"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "432-433",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L432-L433"
     }
    ],
    "range": "OFF, DIA3, DIA7, MAJ, MIN, DOM7, MAJ7, MIN7, SUS4, POW"
   },
   {
    "mode": "lanes",
    "gesture": "turn",
    "action": "Sets the kick lane level.",
    "short_label": "KICK LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "127-130",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L127-L130"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "180-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L180-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "436-437",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L436-L437"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "lanes_2",
    "gesture": "turn",
    "action": "Sets the open-hat lane level.",
    "short_label": "OPEN HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "127-130",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L127-L130"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "180-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L180-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "437-438",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L437-L438"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "voice",
    "gesture": "turn",
    "action": "Chooses polyphonic, monophonic, legato, or unison voices.",
    "short_label": "VOICE MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "99",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L99"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "447-448",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L447-L448"
     }
    ],
    "range": "POLY, MONO, LEG, UNI"
   },
   {
    "mode": "voice_2",
    "gesture": "turn",
    "action": "Chooses rotating or reused voices.",
    "short_label": "VOICE ALLOC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L103"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     }
    ],
    "range": "ROT, REUSE"
   },
   {
    "mode": "voice_3",
    "gesture": "turn",
    "action": "Sets stereo spread between the track voices.",
    "short_label": "VOICE SPREAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "136",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L136"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "449-450",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L449-L450"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Chooses a song section or the add row.",
    "short_label": "SECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "822-827",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L822-L827"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/core.h",
      "lines": "299-307",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/core.h#L299-L307"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "451-452",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L451-L452"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "897-913",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L897-L913"
     }
    ],
    "range": "1–16 and + ADD when fewer than 16 sections"
   },
   {
    "mode": "presets",
    "gesture": "turn",
    "action": "Loads the next or previous sound in the current list.",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "857-860",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L857-L860"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "452-453",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L452-L453"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1012-1023",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1012-L1023"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "turn",
    "action": "Chooses a user preset slot.",
    "short_label": "USER SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "886-889",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L886-L889"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "453-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L453-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1035-1042",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1035-L1042"
     }
    ],
    "range": "1–32"
   },
   {
    "mode": "phrases",
    "gesture": "turn",
    "action": "Chooses the pattern to load.",
    "short_label": "PHRASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "891-894",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L891-L894"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "454-455",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L454-L455"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1025-1033",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1025-L1033"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "turn",
    "action": "Chooses the project slot.",
    "short_label": "PROJECT SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "456-457",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L456-L457"
     }
    ],
    "range": "1–4"
   },
   {
    "mode": "tools",
    "gesture": "turn",
    "action": "Selects clearing the selected track pattern, choosing clockwise and cancelling that choice anticlockwise.",
    "short_label": "PICK CLEAR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "881-884",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L881-L884"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "457-458",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L457-L458"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "991-995",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L991-L995"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2285-2288",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2285-L2288"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "action": "Chooses the arpeggiator pattern.",
    "short_label": "ARP MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "79",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L79"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "458-459",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L458-L459"
     }
    ],
    "range": "OFF, UP, DN, UPDN, RND, ORD, REPEAT, DNUP, UP+8, CONV, DIVG, PINKY, THUMB, WALK, CHORD"
   },
   {
    "mode": "arp_2",
    "gesture": "turn",
    "action": "Sets arpeggiator swing.",
    "short_label": "ARP SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L83"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "459-460",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L459-L460"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Sets the selected track level.",
    "short_label": "TRACK LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "61-145",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L61-L145"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "465-466",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L465-L466"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "997-1010",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L997-L1010"
     }
    ],
    "range": "0–127, shown in dB or OFF"
   },
   {
    "mode": "clock",
    "gesture": "turn",
    "action": "Sets the internal tempo.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "148",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L148"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "466-467",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L466-L467"
     }
    ],
    "range": "40–240 BPM"
   },
   {
    "mode": "keys",
    "gesture": "turn",
    "action": "Chooses one track, layered tracks, or split keys.",
    "short_label": "KEYS MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "186",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L186"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "467-468",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L467-L468"
     }
    ],
    "range": "OFF, LAYER, SPLIT"
   },
   {
    "mode": "fm6_operator",
    "gesture": "turn",
    "action": "Chooses the operator.",
    "short_label": "OPERATOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "3-18",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L3-L18"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "65-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L65-L83"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "439-440",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L439-L440"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "124-190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
     }
    ],
    "range": "1–6"
   },
   {
    "mode": "fm6_op_env",
    "gesture": "turn",
    "action": "Chooses the operator.",
    "short_label": "OPERATOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "3-18",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L3-L18"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "65-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L65-L83"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "440-441",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L440-L441"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "124-190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
     }
    ],
    "range": "1–6"
   },
   {
    "mode": "fm6_operator_2",
    "gesture": "turn",
    "action": "Chooses the operator.",
    "short_label": "OPERATOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "3-18",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L3-L18"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "65-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L65-L83"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "441-442",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L441-L442"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "124-190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
     }
    ],
    "range": "1–6"
   },
   {
    "mode": "slices",
    "gesture": "turn",
    "action": "Chooses the slice marker or the sample end.",
    "short_label": "SLICE MARKER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "125-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L125-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "438-439",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L438-L439"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "78-123",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L78-L123"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1044-1062",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1044-L1062"
     }
    ],
    "range": "1–32 plus END"
   },
   {
    "mode": "analog_edit_1",
    "gesture": "turn",
    "action": "Chooses the oscillator wave pair.",
    "short_label": "ANALOG WAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L193"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "13-13",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L13"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "192-201",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L192-L201"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–6 raw",
    "choices": [
     "SAW",
     "SQR",
     "TRI",
     "SIN",
     "PWM",
     "SYNC",
     "SUB"
    ],
    "parameter": "P_E0"
   },
   {
    "mode": "analog_edit_2",
    "gesture": "turn",
    "action": "Sets the low-pass cutoff.",
    "short_label": "ANALOG CUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "197",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L197"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "192-201",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L192-L201"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "home_analog",
    "gesture": "turn",
    "action": "Sets the low-pass cutoff.",
    "short_label": "ANALOG CUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "197",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L197"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "207",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L207"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "fm6_edit_1",
    "gesture": "turn",
    "action": "Chooses the patch algorithm or an override.",
    "short_label": "FM6 ALG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "434",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L434"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "400-402",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L400-L402"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "433-442",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L433-L442"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–32 raw",
    "choices": [
     "PAT",
     "1",
     "2",
     "3",
     "4",
     "5",
     "6",
     "7",
     "8",
     "9",
     "10",
     "11",
     "12",
     "13",
     "14",
     "15",
     "16",
     "17",
     "18",
     "19",
     "20",
     "21",
     "22",
     "23",
     "24",
     "25",
     "26",
     "27",
     "28",
     "29",
     "30",
     "31",
     "32"
    ],
    "parameter": "P_E0"
   },
   {
    "mode": "fm6_edit_2",
    "gesture": "turn",
    "action": "Changes modulator envelope speed.",
    "short_label": "FM6 MEG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "438",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L438"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "433-442",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L433-L442"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "-64–63 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "home_fm6",
    "gesture": "turn",
    "action": "Offsets modulator output levels.",
    "short_label": "FM6 MLVL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L436"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "447",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L447"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "-64–63 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "phase_edit_1",
    "gesture": "turn",
    "action": "Chooses the main phase-distortion waveform.",
    "short_label": "PHASE WAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "9-9",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L9"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "189-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L189-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–7 raw",
    "choices": [
     "SAW",
     "SQR",
     "PLS",
     "DSIN",
     "SPLS",
     "RSAW",
     "RTRI",
     "RTRP"
    ],
    "parameter": "P_E0"
   },
   {
    "mode": "phase_edit_2",
    "gesture": "turn",
    "action": "Sets the second line detuning.",
    "short_label": "PHASE DTN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "194",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L194"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "189-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L189-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "home_phase",
    "gesture": "turn",
    "action": "Sets phase-distortion depth.",
    "short_label": "PHASE DCW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "192",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L192"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "203",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L203"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "lofi_edit_1",
    "gesture": "turn",
    "action": "Chooses the chip character.",
    "short_label": "LOFI CHIP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "226",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L226"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "11-11",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L11"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "225-234",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–4 raw",
    "choices": [
     "4BIT",
     "4B/2",
     "8BIT",
     "1BIT",
     "STEP"
    ],
    "parameter": "P_E0"
   },
   {
    "mode": "lofi_edit_2",
    "gesture": "turn",
    "action": "Sets the downward pitch sweep.",
    "short_label": "LOFI SWP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "230",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L230"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "225-234",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "home_lofi",
    "gesture": "turn",
    "action": "Chooses the waveform.",
    "short_label": "LOFI WAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "227",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L227"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "12-12",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L12"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "239",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L239"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–4 raw",
    "choices": [
     "PLS",
     "TRI",
     "SAW",
     "NOIS",
     "WRAM"
    ],
    "parameter": "P_E1"
   },
   {
    "mode": "sample_edit_1",
    "gesture": "turn",
    "action": "Chooses the sample instrument or user slot.",
    "short_label": "SAMPLE SET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "262",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L262"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "261-270",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L261-L270"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–SMP_NALL - 1 raw",
    "parameter": "P_E0"
   },
   {
    "mode": "sample_edit_2",
    "gesture": "turn",
    "action": "Sets sample tone.",
    "short_label": "SAMPLE CUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "266",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L266"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "261-270",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L261-L270"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "home_sample",
    "gesture": "turn",
    "action": "Chooses the sample instrument or user slot.",
    "short_label": "SAMPLE SET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "262",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L262"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "275",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L275"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–SMP_NALL - 1 raw",
    "parameter": "P_E0"
   },
   {
    "mode": "voice_edit_1",
    "gesture": "turn",
    "action": "Sets the starting vowel.",
    "short_label": "VOICE VOWL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "223",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L223"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "222-231",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L222-L231"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E0"
   },
   {
    "mode": "voice_edit_2",
    "gesture": "turn",
    "action": "Sets the voiced buzz character.",
    "short_label": "VOICE BUZZ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "227",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L227"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "222-231",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L222-L231"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "home_voice",
    "gesture": "turn",
    "action": "Sets the starting vowel.",
    "short_label": "VOICE VOWL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "223",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L223"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "236",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L236"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E0"
   },
   {
    "mode": "trio_edit_1",
    "gesture": "turn",
    "action": "Chooses the oscillator combination.",
    "short_label": "TRIO WAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "365",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L365"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "40-41",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L40-L41"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "364-373",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L364-L373"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–15 raw",
    "choices": [
     "SAW3",
     "PLS3",
     "PPT",
     "SST",
     "TRI3",
     "S&T",
     "P&S",
     "P+N",
     "NOIS",
     "SYNC",
     "SYNCP",
     "SYNC3",
     "RING",
     "RING3",
     "R+S",
     "R+SP"
    ],
    "parameter": "P_E0"
   },
   {
    "mode": "trio_edit_2",
    "gesture": "turn",
    "action": "Chooses the filter mode.",
    "short_label": "TRIO MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "369",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L369"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "60-60",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L60"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "364-373",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L364-L373"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–3 raw",
    "choices": [
     "LP",
     "BP",
     "HP",
     "NOT"
    ],
    "parameter": "P_E4"
   },
   {
    "mode": "home_trio",
    "gesture": "turn",
    "action": "Sets the filter cutoff.",
    "short_label": "TRIO CUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "370",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L370"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "378",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L378"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E5"
   },
   {
    "mode": "wheel_edit_1",
    "gesture": "turn",
    "action": "Chooses the organ registration.",
    "short_label": "WHEEL REG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "288",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L288"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "43-44",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L43-L44"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "287-296",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L287-L296"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–15 raw",
    "choices": [
     "FLUTE",
     "MELLO",
     "HOLLW",
     "SMOOT",
     "3BAR",
     "BLUES",
     "GOSPL",
     "ROCK",
     "TOPS",
     "CLARI",
     "REED",
     "STRNG",
     "CHAPL",
     "BRITE",
     "BASS",
     "FULL"
    ],
    "parameter": "P_E0"
   },
   {
    "mode": "wheel_edit_2",
    "gesture": "turn",
    "action": "Chooses organ percussion.",
    "short_label": "WHEEL PERC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "292",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L292"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "63-63",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L63"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "287-296",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L287-L296"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–6 raw",
    "choices": [
     "OFF",
     "2ND",
     "3RD",
     "2SOFT",
     "3SOFT",
     "2SLOW",
     "3SLOW"
    ],
    "parameter": "P_E4"
   },
   {
    "mode": "home_wheel",
    "gesture": "turn",
    "action": "Chooses the organ registration.",
    "short_label": "WHEEL REG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "288",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L288"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "43-44",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L43-L44"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "301",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L301"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–15 raw",
    "choices": [
     "FLUTE",
     "MELLO",
     "HOLLW",
     "SMOOT",
     "3BAR",
     "BLUES",
     "GOSPL",
     "ROCK",
     "TOPS",
     "CLARI",
     "REED",
     "STRNG",
     "CHAPL",
     "BRITE",
     "BASS",
     "FULL"
    ],
    "parameter": "P_E0"
   },
   {
    "mode": "grain_edit_1",
    "gesture": "turn",
    "action": "Chooses the sampled material.",
    "short_label": "GRAIN SRC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "447",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L447"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "446-455",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L446-L455"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–SMP_NALL - 1 raw",
    "parameter": "P_E0"
   },
   {
    "mode": "grain_edit_2",
    "gesture": "turn",
    "action": "Transposes grain playback.",
    "short_label": "GRAIN PTCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "451",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L451"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "446-455",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L446-L455"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "-24–24 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "home_grain",
    "gesture": "turn",
    "action": "Sets the grain center position.",
    "short_label": "GRAIN POS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "448",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L448"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "460",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L460"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "phys_edit_1",
    "gesture": "turn",
    "action": "Chooses the physical model.",
    "short_label": "PHYS MODEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "241",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L241"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "61-61",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L61"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "240-249",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L240-L249"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–PM_COUNT - 1 raw",
    "choices": [
     "MODAL",
     "STRNG",
     "MEMB",
     "SYMP"
    ],
    "parameter": "P_E0"
   },
   {
    "mode": "phys_edit_2",
    "gesture": "turn",
    "action": "Sets the excitation position.",
    "short_label": "PHYS POS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "245",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L245"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "240-249",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L240-L249"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "home_phys",
    "gesture": "turn",
    "action": "Sets the model structure.",
    "short_label": "PHYS STRC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "242",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L242"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "254",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L254"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "gurdy_edit_1",
    "gesture": "turn",
    "action": "Sets the drone root.",
    "short_label": "GURDY DRN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "221",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L221"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "22-22",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L22"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "220-229",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L220-L229"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–11 raw",
    "choices": [
     "C",
     "C#",
     "D",
     "D#",
     "E",
     "F",
     "F#",
     "G",
     "G#",
     "A",
     "A#",
     "B"
    ],
    "parameter": "P_E0"
   },
   {
    "mode": "gurdy_edit_2",
    "gesture": "turn",
    "action": "Sets buzzing-bridge strength.",
    "short_label": "GURDY BUZZ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "225",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L225"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "220-229",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L220-L229"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "home_gurdy",
    "gesture": "turn",
    "action": "Sets buzzing-bridge strength.",
    "short_label": "GURDY BUZZ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "225",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L225"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "235",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L235"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "noise_edit_1",
    "gesture": "turn",
    "action": "Chooses the noise generator.",
    "short_label": "NOISE MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "259",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L259"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "20-20",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L20"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "258-267",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L258-L267"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–3 raw",
    "choices": [
     "ANLG",
     "DUST",
     "LFSR",
     "META"
    ],
    "parameter": "P_E0"
   },
   {
    "mode": "noise_edit_2",
    "gesture": "turn",
    "action": "Sets noise filter key tracking.",
    "short_label": "NOISE TRK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "263",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L263"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "258-267",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L258-L267"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "home_noise",
    "gesture": "turn",
    "action": "Sets the noise filter frequency.",
    "short_label": "NOISE FREQ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "261",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L261"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "272",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L272"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "drum_edit_1",
    "gesture": "turn",
    "action": "Chooses the drum kit.",
    "short_label": "DRUM KIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "334",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L334"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "71-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "333-342",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L333-L342"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–DK_COUNT - 1 raw",
    "choices": [
     "STD",
     "66",
     "10",
     "77",
     "80",
     "10",
     "66",
     "55",
     "77",
     "CRYPT"
    ],
    "parameter": "P_E0"
   },
   {
    "mode": "drum_edit_2",
    "gesture": "turn",
    "action": "Sets each drum extra attack character.",
    "short_label": "DRUM SNAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "338",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L338"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "333-342",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L333-L342"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "home_drum",
    "gesture": "turn",
    "action": "Tunes the kit.",
    "short_label": "DRUM TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "335",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L335"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "348",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L348"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "slice_edit_1",
    "gesture": "turn",
    "action": "Chooses slice material.",
    "short_label": "SLICE SRC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "629",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L629"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "67-67",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L67"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "628-637",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L628-L637"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–SLC_NSRC - 1 raw",
    "choices": [
     "BREAK",
     "USR1",
     "USR2",
     "USR3",
     "PIANO"
    ],
    "parameter": "P_E0"
   },
   {
    "mode": "slice_edit_2",
    "gesture": "turn",
    "action": "Chooses one-shot, gated, or looped slices.",
    "short_label": "SLICE MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "633",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L633"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "72-72",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L72"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "628-637",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L628-L637"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–2 raw",
    "choices": [
     "ONE",
     "GATE",
     "LOOP"
    ],
    "parameter": "P_E4"
   },
   {
    "mode": "home_slice",
    "gesture": "turn",
    "action": "Chooses slice material.",
    "short_label": "SLICE SRC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "629",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L629"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "67-67",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L67"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "642",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L642"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–SLC_NSRC - 1 raw",
    "choices": [
     "BREAK",
     "USR1",
     "USR2",
     "USR3",
     "PIANO"
    ],
    "parameter": "P_E0"
   },
   {
    "mode": "home_phys_variant_5",
    "gesture": "turn",
    "action": "Changes drum-head harmonics.",
    "short_label": "PHYS HARM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "18-21",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L18-L21"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "64-76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "home_phys_variant_7",
    "gesture": "turn",
    "action": "Chooses the sympathetic-string tuning.",
    "short_label": "PHYS CHRD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "22-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L22-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "62-76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L62-L76"
     }
    ],
    "range": "0–127 distributed across OCT, 5TH, 4TH, MAJ, MIN, SUS, 7TH, ROOT"
   },
   {
    "mode": "phys_edit_2_variant_8",
    "gesture": "turn",
    "action": "Sets coupling into the sympathetic strings.",
    "short_label": "PHYS SYMP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "22-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L22-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "64-76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "sleep",
    "gesture": "turn",
    "action": "Wakes the screen without changing a value.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "action": "When this encoder is requested, records its physical position and clockwise direction.",
    "short_label": "TEACH KNOB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1786-1810",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1786-L1810"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "turn",
    "action": "Does nothing on INFO.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "turn",
    "action": "Does nothing on ABOUT.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "turn",
    "action": "Does nothing while the confirmation is open.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1590-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1590-L1592"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_g3",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_a3",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_b3",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_c4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_d4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_e4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_g4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_a4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_b4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_c5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_d5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_e5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_g5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_fs3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_g3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_gs3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_a3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_as3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_b3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_c4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_cs4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_d4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_ds4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_e4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_f4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_fs4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_g4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_gs4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_a4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_as4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_b4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_c5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_cs5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_d5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_ds5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_e5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_f5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_fs5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_g5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "turn",
    "action": "Sets the selected engine’s first main value shown on HOME, such as ANALOG cutoff or FM6 modulator level.",
    "short_label": "MAIN 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1518-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1518-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1719-1723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1719-L1723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "887-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L887-L895"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "197",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L197"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "207",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L207"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "14",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L14"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L436"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "447",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L447"
     }
    ]
   }
  ],
  "encoder_knob2": [
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_lfo",
    "action": "Temporarily edits this knob’s sound or effects value on eligible value pages, restoring it when LFO is released unless OCT+ keeps it.",
    "short_label": "TEMPORARY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "62-101",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L62-L101"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1429-1436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1429-L1436"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f3",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_f3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn",
    "action": "Changes the color of the active performance effects.",
    "short_label": "COLOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "688-695",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L688-L695"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "85-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L85-L89"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn",
    "action": "Changes track 2’s level.",
    "short_label": "T2 LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "696-700",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L696-L700"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "turn",
    "action": "Chooses the track’s scale.",
    "short_label": "SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "68-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L68-L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "711-719",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L711-L719"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "turn",
    "action": "Steps through sounds of the selected engine.",
    "short_label": "ENGINE SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "701-707",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L701-L707"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn",
    "action": "Chooses the duration of one step.",
    "short_label": "DIVISION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "70-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L70-L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "711-719",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L711-L719"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "turn",
    "action": "Chooses no count-in, one bar or two bars.",
    "short_label": "COUNT-IN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "430-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L430-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "708-710",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L708-L710"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Steps the selected setting through its allowed values.",
    "short_label": "MENU VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "525-532",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L525-L532"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "turn",
    "action": "Transposes all notes in the step or inserts the last note into an empty step.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "776-809",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L776-L809"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn",
    "action": "Selects one of eight drum lanes.",
    "short_label": "DRUM LANE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "610-620",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L610-L620"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "turn",
    "action": "Moves a record or step timing field to a free step, or selects the step for + ADD.",
    "short_label": "RECORD STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "258-377",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L258-L377"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "turn",
    "action": "Changes the character at the cursor.",
    "short_label": "CHARACTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "221-241",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L221-L241"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "304-307",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L304-L307"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "turn",
    "action": "Sets the decay time.",
    "short_label": "ENV DECAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "64",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L64"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "419-420",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L419-L420"
     }
    ],
    "range": "0–127, displayed as time"
   },
   {
    "mode": "env_dest",
    "gesture": "turn",
    "action": "Sets how strongly the envelope moves pitch.",
    "short_label": "ENV PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "68",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L68"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "420-421",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L420-L421"
     }
    ],
    "range": "-64–63"
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "action": "Chooses the LFO shape.",
    "short_label": "LFO WAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "72",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L72"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "421-422",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L421-L422"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1174-1178",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1174-L1178"
     }
    ],
    "range": "SIN, TRI, SAW, SQR, S&H"
   },
   {
    "mode": "lfo_2",
    "gesture": "turn",
    "action": "Chooses note retrigger or continuous LFO phase.",
    "short_label": "LFO TRIGGER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "133",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L133"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "422-423",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L422-L423"
     }
    ],
    "range": "NOTE, FREE"
   },
   {
    "mode": "lfo_dest",
    "gesture": "turn",
    "action": "Sets LFO filter movement.",
    "short_label": "LFO FILTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L76"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "423-424",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L423-L424"
     }
    ],
    "range": "-64–63"
   },
   {
    "mode": "mod",
    "gesture": "turn",
    "action": "Chooses the selected slot modulation source.",
    "short_label": "MOD SOURCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "61-145",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L61-L145"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "424-425",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L424-L425"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "487-490",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L487-L490"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1079-1089",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1079-L1089"
     }
    ],
    "range": "OFF, LFO, ENV, VEL, KEY, RAND, MODW, AT, EXPR, S&H, SLEW"
   },
   {
    "mode": "fx",
    "gesture": "turn",
    "action": "Sets the track chorus send.",
    "short_label": "CHORUS SEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "96",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L96"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "425-426",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L425-L426"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "slicer",
    "gesture": "turn",
    "action": "Chooses the rhythmic pattern.",
    "short_label": "SLICER PAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "426-427",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L426-L427"
     }
    ],
    "range": "1–16"
   },
   {
    "mode": "delay",
    "gesture": "turn",
    "action": "Sets delay feedback.",
    "short_label": "DELAY FDBK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "153",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L153"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "427-428",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L427-L428"
     }
    ],
    "range": "0–120 raw, up to 94% displayed"
   },
   {
    "mode": "reverb",
    "gesture": "turn",
    "action": "Sets the reverb size.",
    "short_label": "REVERB SIZE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "156",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L156"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "428-429",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L428-L429"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "chorus",
    "gesture": "turn",
    "action": "Sets chorus depth.",
    "short_label": "CHORUS DEPTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "159",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L159"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "429-430",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L429-L430"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "tape",
    "gesture": "turn",
    "action": "Sets the mix bit and sample-rate reduction.",
    "short_label": "CRUSH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "183",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L183"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "430-431",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L430-L431"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "scale",
    "gesture": "turn",
    "action": "Chooses the track scale.",
    "short_label": "SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "88",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L88"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "431-432",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L431-L432"
     }
    ],
    "range": "CHR, MAJ, MIN, DOR, MIX, PEN, MPEN, HARM, PHRY, LYD, LOC, MEL, BLUES, WHOLE, DIMHW, DIMWH, PHDOM, HUNG, DHARM"
   },
   {
    "mode": "chord",
    "gesture": "turn",
    "action": "Chooses the chord voicing.",
    "short_label": "VOICING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "126",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L126"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "432-433",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L432-L433"
     }
    ],
    "range": "CLOSE, OPEN, INV1, INV2, +OCT"
   },
   {
    "mode": "lanes",
    "gesture": "turn",
    "action": "Sets the snare lane level.",
    "short_label": "SNARE LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "127-130",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L127-L130"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "180-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L180-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "436-437",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L436-L437"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "lanes_2",
    "gesture": "turn",
    "action": "Sets the tom lane level.",
    "short_label": "TOM LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "127-130",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L127-L130"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "180-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L180-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "437-438",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L437-L438"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "voice",
    "gesture": "turn",
    "action": "Sets glide time.",
    "short_label": "GLIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "100",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L100"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "447-448",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L447-L448"
     }
    ],
    "range": "0–127, displayed as time"
   },
   {
    "mode": "voice_2",
    "gesture": "turn",
    "action": "Sets unison detuning.",
    "short_label": "UNISON TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "104",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L104"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     }
    ],
    "range": "0–127"
   },
   {
    "mode": "voice_3",
    "gesture": "turn",
    "action": "Has no assigned parameter on this page.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1163-1168",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1163-L1168"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "449-450",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L449-L450"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Chooses the track cell within the section.",
    "short_label": "SONG TRACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "829-831",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L829-L831"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "451-452",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L451-L452"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "897-913",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L897-L913"
     }
    ],
    "range": "T1–T4"
   },
   {
    "mode": "presets",
    "gesture": "turn",
    "action": "Loads the next or previous engine first sound.",
    "short_label": "ENGINE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "860-862",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L860-L862"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "452-453",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L452-L453"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1012-1023",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1012-L1023"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "turn",
    "action": "Selects loading clockwise or cancels that selection anticlockwise.",
    "short_label": "PICK LOAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "881-884",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L881-L884"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "453-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L453-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1035-1042",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1035-L1042"
     }
    ]
   },
   {
    "mode": "phrases",
    "gesture": "turn",
    "action": "Has no turn action because pattern loading is always ready on OCT+.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "881-884",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L881-L884"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1575-1577",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1575-L1577"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "454-455",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L454-L455"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1025-1033",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1025-L1033"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "turn",
    "action": "Has no assigned parameter on this page.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1163-1168",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1163-L1168"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "456-457",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L456-L457"
     }
    ]
   },
   {
    "mode": "tools",
    "gesture": "turn",
    "action": "Selects resetting the track sound, choosing clockwise and cancelling that choice anticlockwise.",
    "short_label": "PICK INIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "881-884",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L881-L884"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "457-458",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L457-L458"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "991-995",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L991-L995"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2285-2288",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2285-L2288"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "action": "Sets the arpeggiator division.",
    "short_label": "ARP RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "80",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L80"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "458-459",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L458-L459"
     }
    ],
    "range": "4BAR, 2BAR, 1/1, 1/2, 1/4, 1/8, 8T, 1/16, 16T, 1/32"
   },
   {
    "mode": "arp_2",
    "gesture": "turn",
    "action": "Sets the chance of arpeggiator notes.",
    "short_label": "ARP CHANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "84",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L84"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "459-460",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L459-L460"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Sets the selected track stereo position.",
    "short_label": "TRACK PAN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "61-145",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L61-L145"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "465-466",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L465-L466"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "997-1010",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L997-L1010"
     }
    ],
    "range": "-64–63"
   },
   {
    "mode": "clock",
    "gesture": "turn",
    "action": "Sets global swing.",
    "short_label": "GLOBAL SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "149",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L149"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "466-467",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L466-L467"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "keys",
    "gesture": "turn",
    "action": "Chooses the second keyboard track.",
    "short_label": "SECOND TRACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "187",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L187"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "467-468",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L467-L468"
     }
    ],
    "range": "T1–T4"
   },
   {
    "mode": "fm6_operator",
    "gesture": "turn",
    "action": "Sets coarse operator frequency.",
    "short_label": "OP FREQUENCY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "3-18",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L3-L18"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "65-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L65-L83"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "439-440",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L439-L440"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "124-190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
     }
    ],
    "range": "RATIO 0.50, 1–31; FIXED cycles through 1, 10, 100, 1000 Hz"
   },
   {
    "mode": "fm6_op_env",
    "gesture": "turn",
    "action": "Chooses attack, decay, sustain, or release stage.",
    "short_label": "ENV STAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "3-18",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L3-L18"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "65-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L65-L83"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "440-441",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L440-L441"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "124-190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
     }
    ],
    "range": "1–4"
   },
   {
    "mode": "fm6_operator_2",
    "gesture": "turn",
    "action": "Chooses a ratio or fixed operator frequency.",
    "short_label": "OP MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "3-18",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L3-L18"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "65-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L65-L83"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "441-442",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L441-L442"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "124-190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
     }
    ],
    "range": "RATIO, FIXED"
   },
   {
    "mode": "slices",
    "gesture": "turn",
    "action": "Moves the selected marker or trims the sample end.",
    "short_label": "MARKER POS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "139-151",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L139-L151"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "438-439",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L438-L439"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "78-123",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L78-L123"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1044-1062",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1044-L1062"
     }
    ]
   },
   {
    "mode": "analog_edit_1",
    "gesture": "turn",
    "action": "Sets oscillator detuning.",
    "short_label": "ANALOG DTN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "194",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L194"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "192-201",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L192-L201"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "analog_edit_2",
    "gesture": "turn",
    "action": "Sets filter resonance.",
    "short_label": "ANALOG RES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "192-201",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L192-L201"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E5"
   },
   {
    "mode": "home_analog",
    "gesture": "turn",
    "action": "Sets filter resonance.",
    "short_label": "ANALOG RES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "207",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L207"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E5"
   },
   {
    "mode": "fm6_edit_1",
    "gesture": "turn",
    "action": "Offsets the patch feedback.",
    "short_label": "FM6 FB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "433-442",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L433-L442"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "-7–7 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "fm6_edit_2",
    "gesture": "turn",
    "action": "Offsets modulator velocity sensitivity.",
    "short_label": "FM6 VMOD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "439",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L439"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "433-442",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L433-L442"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "-7–7 raw",
    "parameter": "P_E5"
   },
   {
    "mode": "home_fm6",
    "gesture": "turn",
    "action": "Offsets modulator coarse ratios.",
    "short_label": "FM6 MRAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "437",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L437"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "447",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L447"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "-16–16 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "phase_edit_1",
    "gesture": "turn",
    "action": "Chooses an alternating waveform or disables alternation.",
    "short_label": "PHASE WAVE2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "191",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L191"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "10-10",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L10"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "189-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L189-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–8 raw",
    "choices": [
     "-",
     "SAW",
     "SQR",
     "PLS",
     "DSIN",
     "SPLS",
     "RSAW",
     "RTRI",
     "RTRP"
    ],
    "parameter": "P_E1"
   },
   {
    "mode": "phase_edit_2",
    "gesture": "turn",
    "action": "Chooses mixed or ring-modulated lines.",
    "short_label": "PHASE LINE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "195",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L195"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "11-11",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L11"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "189-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L189-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–1 raw",
    "choices": [
     "MIX",
     "RING"
    ],
    "parameter": "P_E5"
   },
   {
    "mode": "home_phase",
    "gesture": "turn",
    "action": "Sets envelope movement of distortion depth.",
    "short_label": "PHASE ENV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L193"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "203",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L203"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "lofi_edit_1",
    "gesture": "turn",
    "action": "Chooses the waveform.",
    "short_label": "LOFI WAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "227",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L227"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "12-12",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L12"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "225-234",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–4 raw",
    "choices": [
     "PLS",
     "TRI",
     "SAW",
     "NOIS",
     "WRAM"
    ],
    "parameter": "P_E1"
   },
   {
    "mode": "lofi_edit_2",
    "gesture": "turn",
    "action": "Sets vibrato.",
    "short_label": "LOFI VIB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "231",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L231"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "225-234",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E5"
   },
   {
    "mode": "home_lofi",
    "gesture": "turn",
    "action": "Sets pulse width.",
    "short_label": "LOFI DUTY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "228",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L228"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "239",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L239"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "sample_edit_1",
    "gesture": "turn",
    "action": "Transposes sample playback.",
    "short_label": "SAMPLE TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "263",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L263"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "261-270",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L261-L270"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "-24–24 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "sample_edit_2",
    "gesture": "turn",
    "action": "Has no assigned parameter.",
    "short_label": "SAMPLE -",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "267",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L267"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "261-270",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L261-L270"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–0 raw",
    "parameter": "P_E5"
   },
   {
    "mode": "home_sample",
    "gesture": "turn",
    "action": "Sets sample tone.",
    "short_label": "SAMPLE CUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "266",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L266"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "275",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L275"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "voice_edit_1",
    "gesture": "turn",
    "action": "Sets the target vowel.",
    "short_label": "VOICE VOWL2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "224",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L224"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "222-231",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L222-L231"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "voice_edit_2",
    "gesture": "turn",
    "action": "Sets breath noise.",
    "short_label": "VOICE BRTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "228",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L228"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "222-231",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L222-L231"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E5"
   },
   {
    "mode": "home_voice",
    "gesture": "turn",
    "action": "Sets the voiced buzz character.",
    "short_label": "VOICE BUZZ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "227",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L227"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "236",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L236"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "trio_edit_1",
    "gesture": "turn",
    "action": "Sets oscillator two interval.",
    "short_label": "TRIO INT2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "366",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L366"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "364-373",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L364-L373"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "-24–24 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "trio_edit_2",
    "gesture": "turn",
    "action": "Sets the filter cutoff.",
    "short_label": "TRIO CUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "370",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L370"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "364-373",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L364-L373"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E5"
   },
   {
    "mode": "home_trio",
    "gesture": "turn",
    "action": "Sets filter resonance.",
    "short_label": "TRIO RES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "371",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L371"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "378",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L378"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E6"
   },
   {
    "mode": "wheel_edit_1",
    "gesture": "turn",
    "action": "Offsets the low drawbar levels.",
    "short_label": "WHEEL SUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "289",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L289"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "287-296",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L287-L296"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "-8–8 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "wheel_edit_2",
    "gesture": "turn",
    "action": "Sets key-click level.",
    "short_label": "WHEEL CLICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "293",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L293"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "287-296",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L287-L296"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E5"
   },
   {
    "mode": "home_wheel",
    "gesture": "turn",
    "action": "Chooses organ percussion.",
    "short_label": "WHEEL PERC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "292",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L292"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "63-63",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L63"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "301",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L301"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–6 raw",
    "choices": [
     "OFF",
     "2ND",
     "3RD",
     "2SOFT",
     "3SOFT",
     "2SLOW",
     "3SLOW"
    ],
    "parameter": "P_E4"
   },
   {
    "mode": "grain_edit_1",
    "gesture": "turn",
    "action": "Sets the grain center position.",
    "short_label": "GRAIN POS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "448",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L448"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "446-455",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L446-L455"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "grain_edit_2",
    "gesture": "turn",
    "action": "Sets random position spread.",
    "short_label": "GRAIN SPRD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "452",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L452"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "446-455",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L446-L455"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E5"
   },
   {
    "mode": "home_grain",
    "gesture": "turn",
    "action": "Sets grain duration.",
    "short_label": "GRAIN SIZE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "460",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L460"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "phys_edit_1",
    "gesture": "turn",
    "action": "Sets the model structure.",
    "short_label": "PHYS STRC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "242",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L242"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "240-249",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L240-L249"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "phys_edit_2",
    "gesture": "turn",
    "action": "Sets velocity accent strength.",
    "short_label": "PHYS ACC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "246",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L246"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "240-249",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L240-L249"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E5"
   },
   {
    "mode": "home_phys",
    "gesture": "turn",
    "action": "Sets model brightness.",
    "short_label": "PHYS BRIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "243",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L243"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "254",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L254"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "gurdy_edit_1",
    "gesture": "turn",
    "action": "Sets the root drone level.",
    "short_label": "GURDY DLVL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "222",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L222"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "220-229",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L220-L229"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "gurdy_edit_2",
    "gesture": "turn",
    "action": "Chooses timed strokes, continuous buzz, or a manual crank.",
    "short_label": "GURDY COUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "226",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L226"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "23-23",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L23"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "220-229",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L220-L229"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–5 raw",
    "choices": [
     "HOLD",
     "1/4",
     "1/8",
     "1/8T",
     "1/16",
     "CRANK"
    ],
    "parameter": "P_E5"
   },
   {
    "mode": "home_gurdy",
    "gesture": "turn",
    "action": "Sets wheel pressure.",
    "short_label": "GURDY WHL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "224",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L224"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "235",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L235"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "noise_edit_1",
    "gesture": "turn",
    "action": "Sets noise color.",
    "short_label": "NOISE COLR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "260",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L260"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "258-267",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L258-L267"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "noise_edit_2",
    "gesture": "turn",
    "action": "Sets impulse density.",
    "short_label": "NOISE DENS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "264",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L264"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "258-267",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L258-L267"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E5"
   },
   {
    "mode": "home_noise",
    "gesture": "turn",
    "action": "Sets noise resonance.",
    "short_label": "NOISE RES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "262",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L262"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "272",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L272"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "drum_edit_1",
    "gesture": "turn",
    "action": "Tunes the kit.",
    "short_label": "DRUM TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "335",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L335"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "333-342",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L333-L342"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "drum_edit_2",
    "gesture": "turn",
    "action": "Sets velocity accent strength.",
    "short_label": "DRUM ACC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "339",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L339"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "333-342",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L333-L342"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E5"
   },
   {
    "mode": "home_drum",
    "gesture": "turn",
    "action": "Sets the kit tone.",
    "short_label": "DRUM TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "336",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L336"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "348",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L348"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "slice_edit_1",
    "gesture": "turn",
    "action": "Chooses equal slices, onset slices, or hand-edited slices.",
    "short_label": "SLICE DIV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "630",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L630"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "71-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "628-637",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L628-L637"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–5 raw",
    "choices": [
     "4",
     "8",
     "16",
     "32",
     "AUTO",
     "MAN"
    ],
    "parameter": "P_E1"
   },
   {
    "mode": "slice_edit_2",
    "gesture": "turn",
    "action": "Sets forward or reverse slice playback.",
    "short_label": "SLICE REV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "634",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L634"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "73-73",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L73"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "628-637",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L628-L637"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–1 raw",
    "choices": [
     "OFF",
     "ON"
    ],
    "parameter": "P_E5"
   },
   {
    "mode": "home_slice",
    "gesture": "turn",
    "action": "Chooses equal slices, onset slices, or hand-edited slices.",
    "short_label": "SLICE DIV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "630",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L630"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "71-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "642",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L642"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–5 raw",
    "choices": [
     "4",
     "8",
     "16",
     "32",
     "AUTO",
     "MAN"
    ],
    "parameter": "P_E1"
   },
   {
    "mode": "analog_edit_1_variant_1",
    "gesture": "turn",
    "action": "Sets the synced oscillator pitch above the first oscillator.",
    "short_label": "ANALOG SYNC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "5-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L5-L25"
     }
    ],
    "range": "0–127, up to about 23.8 semitones"
   },
   {
    "mode": "home_lofi_variant_3",
    "gesture": "turn",
    "action": "Chooses the wave-RAM table.",
    "short_label": "LOFI WAV#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "6-7",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "20-21",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L20-L21"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "47-56",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L47-L56"
     }
    ],
    "range": "0–127, distributed across 16 table names"
   },
   {
    "mode": "phys_edit_1_variant_5",
    "gesture": "turn",
    "action": "Changes drum-head harmonics.",
    "short_label": "PHYS HARM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "18-21",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L18-L21"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "64-76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "phys_edit_1_variant_7",
    "gesture": "turn",
    "action": "Chooses the sympathetic-string tuning.",
    "short_label": "PHYS CHRD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "22-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L22-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "62-76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L62-L76"
     }
    ],
    "range": "0–127 distributed across OCT, 5TH, 4TH, MAJ, MIN, SUS, 7TH, ROOT"
   },
   {
    "mode": "noise_edit_2_variant_10",
    "gesture": "turn",
    "action": "Chooses the shift-register length.",
    "short_label": "LFSR LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "8-9",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L8-L9"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "20-26",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L20-L26"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "45-52",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L45-L52"
     }
    ],
    "range": "0–127 distributed across L23, L20, L17, L15, L13, L11, L9, L7"
   },
   {
    "mode": "noise_edit_2_variant_11",
    "gesture": "turn",
    "action": "Chooses the short-register sequence.",
    "short_label": "META LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "8-9",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L8-L9"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "20-26",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L20-L26"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "45-52",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L45-L52"
     }
    ],
    "range": "0–127 distributed across 127, 127B, 93, 63, 63B, 31, 15, 7"
   },
   {
    "mode": "home_gurdy_variant_13",
    "gesture": "turn",
    "action": "Sets how little crank movement gives full wheel pressure.",
    "short_label": "GURDY GEAR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "12-15",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L12-L15"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "210-215",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L210-L215"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "76-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L76-L83"
     }
    ],
    "range": "0–100%, higher requires less turning"
   },
   {
    "mode": "sleep",
    "gesture": "turn",
    "action": "Wakes the screen without changing a value.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "action": "When this encoder is requested, records its physical position and clockwise direction.",
    "short_label": "TEACH KNOB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1786-1810",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1786-L1810"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "turn",
    "action": "Does nothing on INFO.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "turn",
    "action": "Does nothing on ABOUT.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "turn",
    "action": "Does nothing while the confirmation is open.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1590-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1590-L1592"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_g3",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_a3",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_b3",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_c4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_d4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_e4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_g4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_a4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_b4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_c5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_d5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_e5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_g5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_fs3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_g3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_gs3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_a3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_as3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_b3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_c4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_cs4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_d4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_ds4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_e4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_f4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_fs4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_g4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_gs4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_a4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_as4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_b4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_c5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_cs5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_d5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_ds5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_e5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_f5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_fs5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_g5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "turn",
    "action": "Sets the selected engine’s second main value shown on HOME, such as ANALOG resonance or FM6 modulator ratio.",
    "short_label": "MAIN 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1518-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1518-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1719-1723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1719-L1723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "887-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L887-L895"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "207",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L207"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "15",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L15"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "437",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L437"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "447",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L447"
     }
    ]
   }
  ],
  "encoder_knob3": [
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_lfo",
    "action": "Temporarily edits this knob’s sound or effects value on eligible value pages, restoring it when LFO is released unless OCT+ keeps it.",
    "short_label": "TEMPORARY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "62-101",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L62-L101"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1429-1436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1429-L1436"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f3",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_f3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn",
    "action": "Adds reverb space to the performance mix.",
    "short_label": "SPACE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "688-695",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L688-L695"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "85-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L85-L89"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn",
    "action": "Changes track 3’s level.",
    "short_label": "T3 LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "696-700",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L696-L700"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "turn",
    "action": "Chooses the chord type played by one key.",
    "short_label": "CHORD TYPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "68-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L68-L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "711-719",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L711-L719"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "turn",
    "action": "Marks the sound as a favourite clockwise or removes that mark anticlockwise.",
    "short_label": "FAVOURITE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "701-707",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L701-L707"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn",
    "action": "Sets the track’s swing.",
    "short_label": "SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "70-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L70-L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "711-719",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L711-L719"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "turn",
    "action": "Chooses low, medium or high click level.",
    "short_label": "CLICK LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "430-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L430-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "708-710",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L708-L710"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Steps the selected setting through its allowed values.",
    "short_label": "MENU VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "525-532",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L525-L532"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "turn",
    "action": "Chooses NOTE, TIE or REST for the step.",
    "short_label": "NOTE / TIE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "776-809",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L776-L809"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn",
    "action": "Sets the selected lane’s hit on clockwise or off anticlockwise.",
    "short_label": "HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "610-620",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L610-L620"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "turn",
    "action": "Chooses a record’s parameter or the field to create on + ADD, with no change on CHANCE, RATCH or NUDGE rows.",
    "short_label": "PARAMETER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "258-377",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L258-L377"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "turn",
    "action": "Chooses a user category or a random project name; an FM6 rename can detach its patch even without changing the displayed OTHER category.",
    "short_label": "CATEGORY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "221-241",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L221-L241"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "304-307",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L304-L307"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "91-100",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L91-L100"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "244-265",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L244-L265"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/upreset.c",
      "lines": "102-105",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L102-L105"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/upreset.c",
      "lines": "307-343",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L307-L343"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/upreset.c",
      "lines": "438-448",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L438-L448"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/upreset.c",
      "lines": "570-590",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L570-L590"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/up_fm6.c",
      "lines": "76-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/up_fm6.c#L76-L83"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/up_fm6.c",
      "lines": "117-124",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/up_fm6.c#L117-L124"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/up_fm6.c",
      "lines": "201-213",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/up_fm6.c#L201-L213"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/upreset.c",
      "lines": "72-105",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L72-L105"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/upreset.c",
      "lines": "394",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L394"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/upreset.c",
      "lines": "590",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L590"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/category.c",
      "lines": "7-14",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/category.c#L7-L14"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "turn",
    "action": "Sets the sustain level.",
    "short_label": "ENV SUSTAIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "65",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L65"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "419-420",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L419-L420"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "env_dest",
    "gesture": "turn",
    "action": "Sets how strongly the envelope moves the engine shape.",
    "short_label": "ENV SHAPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "69",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L69"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "420-421",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L420-L421"
     }
    ],
    "range": "-64–63"
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "action": "Sets the LFO starting phase.",
    "short_label": "LFO PHASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "73",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L73"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "421-422",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L421-L422"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1174-1178",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1174-L1178"
     }
    ],
    "range": "0–127"
   },
   {
    "mode": "lfo_2",
    "gesture": "turn",
    "action": "Chooses bipolar or positive-only modulation.",
    "short_label": "LFO POLARITY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "134",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L134"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "422-423",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L422-L423"
     }
    ],
    "range": "BI, UNI"
   },
   {
    "mode": "lfo_dest",
    "gesture": "turn",
    "action": "Sets LFO shape movement.",
    "short_label": "LFO SHAPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "77",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L77"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "423-424",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L423-L424"
     }
    ],
    "range": "-64–63"
   },
   {
    "mode": "mod",
    "gesture": "turn",
    "action": "Chooses the selected slot modulation destination.",
    "short_label": "MOD TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "61-145",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L61-L145"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "424-425",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L424-L425"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "487-490",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L487-L490"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1079-1089",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1079-L1089"
     }
    ],
    "range": "OFF, PITCH, CUT, SHP, AMP, PAN, DIST, CHO, DLY, REV, RATE, VIB, E1–E8, DEPTH"
   },
   {
    "mode": "fx",
    "gesture": "turn",
    "action": "Sets the track delay send.",
    "short_label": "DELAY SEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "97",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L97"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "425-426",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L425-L426"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "slicer",
    "gesture": "turn",
    "action": "Sets the slicer division.",
    "short_label": "SLICER RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "109",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L109"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "426-427",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L426-L427"
     }
    ],
    "range": "1/8, 8T, 1/16, 16T, 1/32, 32T"
   },
   {
    "mode": "delay",
    "gesture": "turn",
    "action": "Sets the delay tone.",
    "short_label": "DELAY TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "154",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L154"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "427-428",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L427-L428"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "reverb",
    "gesture": "turn",
    "action": "Sets reverb damping.",
    "short_label": "REVERB DAMP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "157",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L157"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "428-429",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L428-L429"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "chorus",
    "gesture": "turn",
    "action": "Has no assigned parameter on this page.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1163-1168",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1163-L1168"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "429-430",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L429-L430"
     }
    ]
   },
   {
    "mode": "tape",
    "gesture": "turn",
    "action": "Sets the background wind level.",
    "short_label": "CAVE WIND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "184",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L184"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "430-431",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L430-L431"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "scale",
    "gesture": "turn",
    "action": "Chooses how the scale maps played or sequenced notes.",
    "short_label": "KEY QUANTIZE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "431-432",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L431-L432"
     }
    ],
    "range": "OFF, SNAP, WHITE, SEQ"
   },
   {
    "mode": "chord",
    "gesture": "turn",
    "action": "Chooses the tuning temperament.",
    "short_label": "TEMPERAMENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "144",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L144"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "432-433",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L432-L433"
     }
    ],
    "range": "EQUAL, PYTH, MEAN, JUST"
   },
   {
    "mode": "lanes",
    "gesture": "turn",
    "action": "Sets the clap lane level.",
    "short_label": "CLAP LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "127-130",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L127-L130"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "180-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L180-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "436-437",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L436-L437"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "lanes_2",
    "gesture": "turn",
    "action": "Sets the rim lane level.",
    "short_label": "RIM LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "127-130",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L127-L130"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "180-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L180-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "437-438",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L437-L438"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "voice",
    "gesture": "turn",
    "action": "Chooses constant-rate or constant-time glide.",
    "short_label": "GLIDE MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "101",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L101"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "447-448",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L447-L448"
     }
    ],
    "range": "RATE, TIME"
   },
   {
    "mode": "voice_2",
    "gesture": "turn",
    "action": "Sets the track stereo position.",
    "short_label": "TRACK PAN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "105",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L105"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     }
    ],
    "range": "-64–63"
   },
   {
    "mode": "voice_3",
    "gesture": "turn",
    "action": "Has no assigned parameter on this page.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1163-1168",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1163-L1168"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "449-450",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L449-L450"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Sets the selected cell project slot.",
    "short_label": "SONG PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "833-841",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L833-L841"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "451-452",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L451-L452"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "897-913",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L897-L913"
     }
    ],
    "range": "A–D or silent"
   },
   {
    "mode": "presets",
    "gesture": "turn",
    "action": "Adds the current sound to favourites clockwise or removes it anticlockwise.",
    "short_label": "FAVOURITE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "862-864",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L862-L864"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "452-453",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L452-L453"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1012-1023",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1012-L1023"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "turn",
    "action": "Selects erasing clockwise or cancels that selection anticlockwise.",
    "short_label": "PICK ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "881-884",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L881-L884"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "453-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L453-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1035-1042",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1035-L1042"
     }
    ]
   },
   {
    "mode": "phrases",
    "gesture": "turn",
    "action": "Has no assigned parameter on this page.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1163-1168",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1163-L1168"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "454-455",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L454-L455"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1025-1033",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1025-L1033"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "turn",
    "action": "Selects loading clockwise or cancels that selection anticlockwise.",
    "short_label": "PROJECT LOAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "881-884",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L881-L884"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "456-457",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L456-L457"
     }
    ]
   },
   {
    "mode": "tools",
    "gesture": "turn",
    "action": "Selects deleting the current song section, choosing clockwise and cancelling that choice anticlockwise.",
    "short_label": "PICK DELETE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "881-884",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L881-L884"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "457-458",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L457-L458"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "991-995",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L991-L995"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2285-2288",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2285-L2288"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "action": "Sets the arpeggiator octave span.",
    "short_label": "ARP OCTAVES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "458-459",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L458-L459"
     }
    ],
    "range": "1–4"
   },
   {
    "mode": "arp_2",
    "gesture": "turn",
    "action": "Keeps arpeggiator notes after key release.",
    "short_label": "ARP HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "85",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L85"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "459-460",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L459-L460"
     }
    ],
    "range": "OFF, ON"
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Sets the selected track reverb send.",
    "short_label": "REVERB SEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "61-145",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L61-L145"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "465-466",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L465-L466"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "997-1010",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L997-L1010"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "clock",
    "gesture": "turn",
    "action": "Chooses the clock source.",
    "short_label": "CLOCK SOURCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "150",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L150"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "466-467",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L466-L467"
     }
    ],
    "range": "INT, USB, TRS"
   },
   {
    "mode": "keys",
    "gesture": "turn",
    "action": "Sets the upper keyboard part first key.",
    "short_label": "SPLIT POINT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "188",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L188"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "467-468",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L467-L468"
     }
    ],
    "range": "G#3–G5"
   },
   {
    "mode": "fm6_operator",
    "gesture": "turn",
    "action": "Sets fine operator frequency.",
    "short_label": "OP FINE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "3-18",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L3-L18"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "65-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L65-L83"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "439-440",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L439-L440"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "124-190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
     }
    ],
    "range": "0–99"
   },
   {
    "mode": "fm6_op_env",
    "gesture": "turn",
    "action": "Sets the selected envelope stage rate.",
    "short_label": "OP ENV RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "3-18",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L3-L18"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "65-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L65-L83"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "440-441",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L440-L441"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "124-190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
     }
    ],
    "range": "0–99"
   },
   {
    "mode": "fm6_operator_2",
    "gesture": "turn",
    "action": "Sets operator detuning.",
    "short_label": "OP DETUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "3-18",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L3-L18"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "65-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L65-L83"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "441-442",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L441-L442"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "124-190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
     }
    ],
    "range": "-7–7"
   },
   {
    "mode": "slices",
    "gesture": "turn",
    "action": "Selects splitting the selected slice for OCT+.",
    "short_label": "PICK SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "3-17",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L3-L17"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "438-439",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L438-L439"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "78-123",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L78-L123"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1044-1062",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1044-L1062"
     }
    ]
   },
   {
    "mode": "analog_edit_1",
    "gesture": "turn",
    "action": "Sets the blend between the oscillators.",
    "short_label": "ANALOG MIX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "195",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L195"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "192-201",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L192-L201"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "analog_edit_2",
    "gesture": "turn",
    "action": "Sets oscillator drive.",
    "short_label": "ANALOG DRV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "199",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L199"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "192-201",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L192-L201"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E6"
   },
   {
    "mode": "home_analog",
    "gesture": "turn",
    "action": "Sets the attack time.",
    "short_label": "ANALOG ATK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "207",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L207"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "63",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L63"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127, displayed as time",
    "parameter": "P_ATK"
   },
   {
    "mode": "fm6_edit_1",
    "gesture": "turn",
    "action": "Offsets modulator output levels.",
    "short_label": "FM6 MLVL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L436"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "433-442",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L433-L442"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "-64–63 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "fm6_edit_2",
    "gesture": "turn",
    "action": "Spreads carrier tuning.",
    "short_label": "FM6 DTUN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "440",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L440"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "433-442",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L433-L442"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E6"
   },
   {
    "mode": "home_fm6",
    "gesture": "turn",
    "action": "Changes modulator envelope speed.",
    "short_label": "FM6 MEG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "438",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L438"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "447",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L447"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "-64–63 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "phase_edit_1",
    "gesture": "turn",
    "action": "Sets phase-distortion depth.",
    "short_label": "PHASE DCW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "192",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L192"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "189-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L189-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "phase_edit_2",
    "gesture": "turn",
    "action": "Sets the lower sine level.",
    "short_label": "PHASE SUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "196",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L196"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "189-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L189-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E6"
   },
   {
    "mode": "home_phase",
    "gesture": "turn",
    "action": "Sets the second line detuning.",
    "short_label": "PHASE DTN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "194",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L194"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "203",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L203"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "lofi_edit_1",
    "gesture": "turn",
    "action": "Sets pulse width.",
    "short_label": "LOFI DUTY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "228",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L228"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "225-234",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "lofi_edit_2",
    "gesture": "turn",
    "action": "Chooses the chip chord arpeggio.",
    "short_label": "LOFI ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "232",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L232"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "13-13",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L13"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "225-234",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–3 raw",
    "choices": [
     "OFF",
     "OCT",
     "MAJ",
     "MIN"
    ],
    "parameter": "P_E6"
   },
   {
    "mode": "home_lofi",
    "gesture": "turn",
    "action": "Sets digital degradation.",
    "short_label": "LOFI CRSH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "229",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L229"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "239",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L239"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "sample_edit_1",
    "gesture": "turn",
    "action": "Sets sample bit reduction.",
    "short_label": "SAMPLE BITS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "264",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L264"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "261-270",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L261-L270"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "sample_edit_2",
    "gesture": "turn",
    "action": "Sets sample drive.",
    "short_label": "SAMPLE DRV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "268",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L268"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "261-270",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L261-L270"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E6"
   },
   {
    "mode": "home_sample",
    "gesture": "turn",
    "action": "Sets the attack time.",
    "short_label": "SAMPLE ATK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "275",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L275"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "63",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L63"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127, displayed as time",
    "parameter": "P_ATK"
   },
   {
    "mode": "voice_edit_1",
    "gesture": "turn",
    "action": "Sets the transition time between vowels.",
    "short_label": "VOICE TALK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "225",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L225"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "222-231",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L222-L231"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "voice_edit_2",
    "gesture": "turn",
    "action": "Sets formant resonance.",
    "short_label": "VOICE Q",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "229",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L229"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "222-231",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L222-L231"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E6"
   },
   {
    "mode": "home_voice",
    "gesture": "turn",
    "action": "Sets breath noise.",
    "short_label": "VOICE BRTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "228",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L228"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "236",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L236"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E5"
   },
   {
    "mode": "trio_edit_1",
    "gesture": "turn",
    "action": "Sets oscillator three interval.",
    "short_label": "TRIO INT3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "367",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L367"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "364-373",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L364-L373"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "-24–24 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "trio_edit_2",
    "gesture": "turn",
    "action": "Sets filter resonance.",
    "short_label": "TRIO RES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "371",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L371"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "364-373",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L364-L373"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E6"
   },
   {
    "mode": "home_trio",
    "gesture": "turn",
    "action": "Sets pulse width.",
    "short_label": "TRIO PW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "372",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L372"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "378",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L378"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E7"
   },
   {
    "mode": "wheel_edit_1",
    "gesture": "turn",
    "action": "Offsets the middle drawbar levels.",
    "short_label": "WHEEL BODY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "290",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L290"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "287-296",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L287-L296"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "-8–8 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "wheel_edit_2",
    "gesture": "turn",
    "action": "Sets organ overdrive.",
    "short_label": "WHEEL DRV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "294",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L294"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "287-296",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L287-L296"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E6"
   },
   {
    "mode": "home_wheel",
    "gesture": "turn",
    "action": "Sets organ overdrive.",
    "short_label": "WHEEL DRV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "294",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L294"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "301",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L301"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E6"
   },
   {
    "mode": "grain_edit_1",
    "gesture": "turn",
    "action": "Sets grain duration.",
    "short_label": "GRAIN SIZE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "446-455",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L446-L455"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "grain_edit_2",
    "gesture": "turn",
    "action": "Sets random tuning and reverse-grain amount.",
    "short_label": "GRAIN RAND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "453",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L453"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "446-455",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L446-L455"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E6"
   },
   {
    "mode": "home_grain",
    "gesture": "turn",
    "action": "Sets how frequently grains begin.",
    "short_label": "GRAIN DENS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "450",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L450"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "460",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L460"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "phys_edit_1",
    "gesture": "turn",
    "action": "Sets model brightness.",
    "short_label": "PHYS BRIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "243",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L243"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "240-249",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L240-L249"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "phys_edit_2",
    "gesture": "turn",
    "action": "Sets sustained excitation.",
    "short_label": "PHYS BOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "247",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L247"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "240-249",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L240-L249"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E6"
   },
   {
    "mode": "home_phys",
    "gesture": "turn",
    "action": "Sets model damping.",
    "short_label": "PHYS DAMP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "244",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L244"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "254",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L254"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "gurdy_edit_1",
    "gesture": "turn",
    "action": "Sets the fifth drone level.",
    "short_label": "GURDY 5TH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "223",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L223"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "220-229",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L220-L229"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "gurdy_edit_2",
    "gesture": "turn",
    "action": "Sets the body resonance level.",
    "short_label": "GURDY BODY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "227",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L227"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "220-229",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L220-L229"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E6"
   },
   {
    "mode": "home_gurdy",
    "gesture": "turn",
    "action": "Sets the root drone level.",
    "short_label": "GURDY DLVL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "222",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L222"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "235",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L235"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "noise_edit_1",
    "gesture": "turn",
    "action": "Sets the noise filter frequency.",
    "short_label": "NOISE FREQ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "261",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L261"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "258-267",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L258-L267"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "noise_edit_2",
    "gesture": "turn",
    "action": "Sets random noise drift.",
    "short_label": "NOISE DRFT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "265",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L265"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "258-267",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L258-L267"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E6"
   },
   {
    "mode": "home_noise",
    "gesture": "turn",
    "action": "Sets noise color.",
    "short_label": "NOISE COLR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "260",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L260"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "272",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L272"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "drum_edit_1",
    "gesture": "turn",
    "action": "Sets the kit tone.",
    "short_label": "DRUM TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "336",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L336"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "333-342",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L333-L342"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "drum_edit_2",
    "gesture": "turn",
    "action": "Chooses the standard-kit kick character.",
    "short_label": "DRUM KICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "340",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L340"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "72-72",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L72"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "333-342",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L333-L342"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–1 raw",
    "choices": [
     "PUNCH",
     "ROUND"
    ],
    "parameter": "P_E6"
   },
   {
    "mode": "home_drum",
    "gesture": "turn",
    "action": "Sets the kit decay.",
    "short_label": "DRUM DECY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "337",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L337"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "348",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L348"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "slice_edit_1",
    "gesture": "turn",
    "action": "Offsets the first slice assigned to the keys.",
    "short_label": "SLICE START",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "631",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L631"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "628-637",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L628-L637"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–31 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "slice_edit_2",
    "gesture": "turn",
    "action": "Sets slice decay.",
    "short_label": "SLICE DCAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "635",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L635"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "628-637",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L628-L637"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E6"
   },
   {
    "mode": "home_slice",
    "gesture": "turn",
    "action": "Transposes slice playback.",
    "short_label": "SLICE PTCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "632",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L632"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "642",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L642"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "-24–24 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "analog_edit_1_variant_2",
    "gesture": "turn",
    "action": "Sets the lower square-wave level.",
    "short_label": "ANALOG SUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "11-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L11-L25"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "lofi_edit_1_variant_3",
    "gesture": "turn",
    "action": "Chooses the wave-RAM table.",
    "short_label": "LOFI WAV#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "6-7",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "20-21",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L20-L21"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "47-56",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L47-L56"
     }
    ],
    "range": "0–127, distributed across 16 table names"
   },
   {
    "mode": "home_lofi_variant_4",
    "gesture": "turn",
    "action": "Chooses constant volume, a single decay, or repeating decay.",
    "short_label": "LOFI DCY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "42-56",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L42-L56"
     }
    ],
    "range": "0–127, distributed across CONST, D0–D15, L1–L15"
   },
   {
    "mode": "phys_edit_2_variant_6",
    "gesture": "turn",
    "action": "Sets the falling pitch after the strike.",
    "short_label": "PHYS BEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "18-21",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L18-L21"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "64-76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
     }
    ],
    "range": "0–100%, up to 12 semitones"
   },
   {
    "mode": "phys_edit_2_variant_9",
    "gesture": "turn",
    "action": "Sets the curved-bridge buzz.",
    "short_label": "PHYS BUZZ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "22-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L22-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "64-76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "sleep",
    "gesture": "turn",
    "action": "Wakes the screen without changing a value.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "action": "When this encoder is requested, records its physical position and clockwise direction.",
    "short_label": "TEACH KNOB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1786-1810",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1786-L1810"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "turn",
    "action": "Does nothing on INFO.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "turn",
    "action": "Does nothing on ABOUT.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "turn",
    "action": "Does nothing while the confirmation is open.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1590-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1590-L1592"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_g3",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_a3",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_b3",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_c4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_d4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_e4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_g4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_a4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_b4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_c5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_d5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_e5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_g5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_fs3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_g3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_gs3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_a3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_as3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_b3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_c4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_cs4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_d4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_ds4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_e4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_f4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_fs4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_g4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_gs4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_a4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_as4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_b4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_c5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_cs5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_d5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_ds5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_e5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_f5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_fs5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_g5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "turn",
    "action": "Sets the selected engine’s third main value shown on HOME, such as ANALOG attack or FM6 modulator envelope speed.",
    "short_label": "MAIN 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1518-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1518-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1719-1723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1719-L1723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "887-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L887-L895"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "207",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L207"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "63",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L63"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "16",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L16"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "438",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L438"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "447",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L447"
     }
    ]
   }
  ],
  "encoder_knob4": [
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_lfo",
    "action": "Temporarily edits this knob’s sound or effects value on eligible value pages, restoring it when LFO is released unless OCT+ keeps it.",
    "short_label": "TEMPORARY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "62-101",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L62-L101"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1429-1436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1429-L1436"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f3",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_f3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn",
    "action": "Changes performance-effect depth, or octave-harmonizer shimmer when it is active.",
    "short_label": "DEPTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "688-695",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L688-L695"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "85-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L85-L89"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn",
    "action": "Changes track 4’s level.",
    "short_label": "T4 LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "696-700",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L696-L700"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "turn",
    "action": "Chooses the chord voicing.",
    "short_label": "VOICING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "68-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L68-L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "711-719",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L711-L719"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "turn",
    "action": "Does nothing in this layer.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "701-707",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L701-L707"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn",
    "action": "Sets the track’s note gate.",
    "short_label": "GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "70-71",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L70-L71"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "711-719",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L711-L719"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "turn",
    "action": "Does nothing in this layer.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "430-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L430-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "708-710",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L708-L710"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Steps the selected setting through its allowed values.",
    "short_label": "MENU VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "525-532",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L525-L532"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "turn",
    "action": "Chooses no flag, accent, slide or both for the step.",
    "short_label": "ACC / SLIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "776-809",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L776-L809"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn",
    "action": "Sets the selected lane’s accent on clockwise or off anticlockwise.",
    "short_label": "ACCENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "610-620",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L610-L620"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "turn",
    "action": "Sets a record’s value, CHANCE 0–100%, RATCH ×1–4 or NUDGE −8 to +7, or toggles PLAY and QUANTIZE, with no change on + ADD.",
    "short_label": "VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "258-377",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L258-L377"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "turn",
    "action": "Does nothing on NAME.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "221-241",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L221-L241"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "304-307",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L304-L307"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "turn",
    "action": "Sets the release time.",
    "short_label": "ENV RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "66",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L66"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "419-420",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L419-L420"
     }
    ],
    "range": "0–127, displayed as time"
   },
   {
    "mode": "env_dest",
    "gesture": "turn",
    "action": "Has no assigned parameter on this page.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1163-1168",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1163-L1168"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "420-421",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L420-L421"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "action": "Sets how long the LFO takes to fade in.",
    "short_label": "LFO FADE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "74",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L74"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "421-422",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L421-L422"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1174-1178",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1174-L1178"
     }
    ],
    "range": "0–127, displayed as time"
   },
   {
    "mode": "lfo_2",
    "gesture": "turn",
    "action": "Has no assigned parameter on this page.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1163-1168",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1163-L1168"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "422-423",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L422-L423"
     }
    ]
   },
   {
    "mode": "lfo_dest",
    "gesture": "turn",
    "action": "Sets LFO amplitude movement.",
    "short_label": "LFO VOLUME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "78",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L78"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "423-424",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L423-L424"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "mod",
    "gesture": "turn",
    "action": "Sets the selected slot modulation depth.",
    "short_label": "MOD DEPTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "61-145",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L61-L145"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "424-425",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L424-L425"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "487-490",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L487-L490"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1079-1089",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1079-L1089"
     }
    ],
    "range": "-64–63"
   },
   {
    "mode": "fx",
    "gesture": "turn",
    "action": "Sets the track reverb send.",
    "short_label": "REVERB SEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "98",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L98"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "425-426",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L425-L426"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "slicer",
    "gesture": "turn",
    "action": "Sets the slicer strength.",
    "short_label": "SLICER DEPTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "110",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L110"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "426-427",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L426-L427"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "delay",
    "gesture": "turn",
    "action": "Sets the delay return level.",
    "short_label": "DELAY MIX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "155",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L155"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "427-428",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L427-L428"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "reverb",
    "gesture": "turn",
    "action": "Has no assigned parameter on this page.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1163-1168",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1163-L1168"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "428-429",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L428-L429"
     }
    ]
   },
   {
    "mode": "chorus",
    "gesture": "turn",
    "action": "Has no assigned parameter on this page.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1163-1168",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1163-L1168"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "429-430",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L429-L430"
     }
    ]
   },
   {
    "mode": "tape",
    "gesture": "turn",
    "action": "Sets crackle within the ambience.",
    "short_label": "CRACKLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "185",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L185"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "430-431",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L430-L431"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "scale",
    "gesture": "turn",
    "action": "Transposes the track.",
    "short_label": "TRANSPOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "90",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L90"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "431-432",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L431-L432"
     }
    ],
    "range": "-24–24 semitones"
   },
   {
    "mode": "chord",
    "gesture": "turn",
    "action": "Has no assigned parameter on this page.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1163-1168",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1163-L1168"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "432-433",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L432-L433"
     }
    ]
   },
   {
    "mode": "lanes",
    "gesture": "turn",
    "action": "Sets the closed-hat lane level.",
    "short_label": "HAT LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "127-130",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L127-L130"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "180-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L180-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "436-437",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L436-L437"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "lanes_2",
    "gesture": "turn",
    "action": "Sets the bell lane level.",
    "short_label": "BELL LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "127-130",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L127-L130"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "180-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L180-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "437-438",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L437-L438"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "voice",
    "gesture": "turn",
    "action": "Chooses which held note has priority.",
    "short_label": "NOTE ORDER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "102",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L102"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "447-448",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L447-L448"
     }
    ],
    "range": "LAST, LOW, HIGH"
   },
   {
    "mode": "voice_2",
    "gesture": "turn",
    "action": "Mutes or unmutes the track.",
    "short_label": "TRACK MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "106",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L106"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     }
    ],
    "range": "OFF, ON"
   },
   {
    "mode": "voice_3",
    "gesture": "turn",
    "action": "Has no assigned parameter on this page.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1163-1168",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1163-L1168"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "449-450",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L449-L450"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Sets how many times the section repeats.",
    "short_label": "REPEATS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "833-842",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L833-L842"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "451-452",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L451-L452"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "897-913",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L897-L913"
     }
    ],
    "range": "1–16"
   },
   {
    "mode": "presets",
    "gesture": "turn",
    "action": "Chooses the sound list filter.",
    "short_label": "SOUND LIST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "864-870",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L864-L870"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "452-453",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L452-L453"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1012-1023",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1012-L1023"
     }
    ],
    "range": "ALL, FAV, BASS, LEAD, PAD, PLUCK, KEYS, DRUM, FX, OTHER"
   },
   {
    "mode": "user",
    "gesture": "turn",
    "action": "Selects saving clockwise or cancels that selection anticlockwise.",
    "short_label": "PICK SAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "881-884",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L881-L884"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "453-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L453-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1035-1042",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1035-L1042"
     }
    ]
   },
   {
    "mode": "phrases",
    "gesture": "turn",
    "action": "Has no assigned parameter on this page.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1163-1168",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1163-L1168"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "454-455",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L454-L455"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1025-1033",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1025-L1033"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "turn",
    "action": "Selects saving clockwise or cancels that selection anticlockwise.",
    "short_label": "PROJECT SAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "881-884",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L881-L884"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "456-457",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L456-L457"
     }
    ]
   },
   {
    "mode": "tools",
    "gesture": "turn",
    "action": "Selects clearing the song arrangement, choosing clockwise and cancelling that choice anticlockwise.",
    "short_label": "PICK RESET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "881-884",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L881-L884"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "457-458",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L457-L458"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "991-995",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L991-L995"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2285-2288",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2285-L2288"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "action": "Sets arpeggiator note duration.",
    "short_label": "ARP GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "82",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L82"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "458-459",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L458-L459"
     }
    ],
    "range": "1–127 raw"
   },
   {
    "mode": "arp_2",
    "gesture": "turn",
    "action": "Chooses pitch or played-note ordering.",
    "short_label": "ARP ORDER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "86",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L86"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "459-460",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L459-L460"
     }
    ],
    "range": "NOTE, PLAY"
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Mutes clockwise or unmutes anticlockwise.",
    "short_label": "TRACK MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "465-488",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L465-L488"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "465-466",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L465-L466"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "997-1010",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L997-L1010"
     }
    ]
   },
   {
    "mode": "clock",
    "gesture": "turn",
    "action": "Has no assigned parameter on this page.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1163-1168",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1163-L1168"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "466-467",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L466-L467"
     }
    ]
   },
   {
    "mode": "keys",
    "gesture": "turn",
    "action": "Transposes the second keyboard track.",
    "short_label": "SECOND OCT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "147-189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L147-L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "189",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L189"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "467-468",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L467-L468"
     }
    ],
    "range": "-2, -1, 0, +1, +2 octaves"
   },
   {
    "mode": "fm6_operator",
    "gesture": "turn",
    "action": "Sets operator output level.",
    "short_label": "OP LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "3-18",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L3-L18"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "65-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L65-L83"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "439-440",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L439-L440"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "124-190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
     }
    ],
    "range": "0–99"
   },
   {
    "mode": "fm6_op_env",
    "gesture": "turn",
    "action": "Sets the selected envelope stage level.",
    "short_label": "OP ENV LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "3-18",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L3-L18"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "65-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L65-L83"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "440-441",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L440-L441"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "124-190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
     }
    ],
    "range": "0–99"
   },
   {
    "mode": "fm6_operator_2",
    "gesture": "turn",
    "action": "Sets operator velocity sensitivity.",
    "short_label": "OP VELOCITY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "3-18",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L3-L18"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "65-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L65-L83"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "441-442",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L441-L442"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "124-190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
     }
    ],
    "range": "0–7"
   },
   {
    "mode": "slices",
    "gesture": "turn",
    "action": "Selects joining the slice to its predecessor for OCT+.",
    "short_label": "PICK JOIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "3-17",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L3-L17"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "438-439",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L438-L439"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "78-123",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L78-L123"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1044-1062",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1044-L1062"
     }
    ]
   },
   {
    "mode": "analog_edit_1",
    "gesture": "turn",
    "action": "Sets the oscillator noise level.",
    "short_label": "ANALOG NOIS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "196",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L196"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "192-201",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L192-L201"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "analog_edit_2",
    "gesture": "turn",
    "action": "Sets filter key tracking.",
    "short_label": "ANALOG KTR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "200",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L200"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "192-201",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L192-L201"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E7"
   },
   {
    "mode": "home_analog",
    "gesture": "turn",
    "action": "Sets the release time.",
    "short_label": "ANALOG REL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "207",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L207"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "66",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L66"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127, displayed as time",
    "parameter": "P_REL"
   },
   {
    "mode": "fm6_edit_1",
    "gesture": "turn",
    "action": "Offsets modulator coarse ratios.",
    "short_label": "FM6 MRAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "437",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L437"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "433-442",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L433-L442"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "-16–16 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "fm6_edit_2",
    "gesture": "turn",
    "action": "Loads a factory patch, the retained own patch, or a populated voice-bank slot.",
    "short_label": "FM6 SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "441",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L441"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "403-407",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L403-L407"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "433-442",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L433-L442"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–FM6_OWN + FM6_NBANK raw",
    "choices": [
     "F1",
     "F2",
     "F3",
     "F4",
     "F5",
     "F6",
     "F7",
     "F8",
     "F9",
     "F10",
     "F11",
     "F12",
     "F13",
     "F14",
     "F15",
     "OWN",
     "B1",
     "B2",
     "B3",
     "B4",
     "B5",
     "B6",
     "B7",
     "B8",
     "B9",
     "B10",
     "B11",
     "B12",
     "B13",
     "B14",
     "B15",
     "B16",
     "B17",
     "B18",
     "B19",
     "B20",
     "B21",
     "B22",
     "B23",
     "B24",
     "B25",
     "B26",
     "B27",
     "B28",
     "B29",
     "B30",
     "B31",
     "B32"
    ],
    "parameter": "P_E7"
   },
   {
    "mode": "home_fm6",
    "gesture": "turn",
    "action": "Loads a factory patch, the retained own patch, or a populated voice-bank slot.",
    "short_label": "FM6 SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "441",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L441"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "403-407",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L403-L407"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "447",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L447"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–FM6_OWN + FM6_NBANK raw",
    "choices": [
     "F1",
     "F2",
     "F3",
     "F4",
     "F5",
     "F6",
     "F7",
     "F8",
     "F9",
     "F10",
     "F11",
     "F12",
     "F13",
     "F14",
     "F15",
     "OWN",
     "B1",
     "B2",
     "B3",
     "B4",
     "B5",
     "B6",
     "B7",
     "B8",
     "B9",
     "B10",
     "B11",
     "B12",
     "B13",
     "B14",
     "B15",
     "B16",
     "B17",
     "B18",
     "B19",
     "B20",
     "B21",
     "B22",
     "B23",
     "B24",
     "B25",
     "B26",
     "B27",
     "B28",
     "B29",
     "B30",
     "B31",
     "B32"
    ],
    "parameter": "P_E7"
   },
   {
    "mode": "phase_edit_1",
    "gesture": "turn",
    "action": "Sets envelope movement of distortion depth.",
    "short_label": "PHASE ENV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L193"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "189-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L189-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "phase_edit_2",
    "gesture": "turn",
    "action": "Has no assigned parameter.",
    "short_label": "PHASE -",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "197",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L197"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "189-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L189-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–0 raw",
    "parameter": "P_E7"
   },
   {
    "mode": "home_phase",
    "gesture": "turn",
    "action": "Sets the release time.",
    "short_label": "PHASE REL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "203",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L203"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "66",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L66"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127, displayed as time",
    "parameter": "P_REL"
   },
   {
    "mode": "lofi_edit_1",
    "gesture": "turn",
    "action": "Sets digital degradation.",
    "short_label": "LOFI CRSH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "229",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L229"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "225-234",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "lofi_edit_2",
    "gesture": "turn",
    "action": "Sets the output tone.",
    "short_label": "LOFI TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "233",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L233"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "225-234",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E7"
   },
   {
    "mode": "home_lofi",
    "gesture": "turn",
    "action": "Sets the release time.",
    "short_label": "LOFI REL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "239",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L239"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "66",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L66"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127, displayed as time",
    "parameter": "P_REL"
   },
   {
    "mode": "sample_edit_1",
    "gesture": "turn",
    "action": "Enables or disables sample looping.",
    "short_label": "SAMPLE LOOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "265",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L265"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "4-4",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L4"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "261-270",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L261-L270"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–1 raw",
    "choices": [
     "OFF",
     "ON"
    ],
    "parameter": "P_E3"
   },
   {
    "mode": "sample_edit_2",
    "gesture": "turn",
    "action": "Has no assigned parameter.",
    "short_label": "SAMPLE -",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "269",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L269"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "261-270",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L261-L270"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–0 raw",
    "parameter": "P_E7"
   },
   {
    "mode": "home_sample",
    "gesture": "turn",
    "action": "Sets the release time.",
    "short_label": "SAMPLE REL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "275",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L275"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "66",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L66"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127, displayed as time",
    "parameter": "P_REL"
   },
   {
    "mode": "voice_edit_1",
    "gesture": "turn",
    "action": "Shifts the vocal formants.",
    "short_label": "VOICE SHIFT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "226",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L226"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "222-231",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L222-L231"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "-12–12 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "voice_edit_2",
    "gesture": "turn",
    "action": "Sets random vowel variation.",
    "short_label": "VOICE RAND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "230",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L230"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "222-231",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L222-L231"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E7"
   },
   {
    "mode": "home_voice",
    "gesture": "turn",
    "action": "Sets the transition time between vowels.",
    "short_label": "VOICE TALK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "225",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L225"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "236",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L236"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E2"
   },
   {
    "mode": "trio_edit_1",
    "gesture": "turn",
    "action": "Detunes oscillators two and three in opposite directions.",
    "short_label": "TRIO DTN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "368",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L368"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "364-373",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L364-L373"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–50 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "trio_edit_2",
    "gesture": "turn",
    "action": "Sets pulse width.",
    "short_label": "TRIO PW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "372",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L372"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "364-373",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L364-L373"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E7"
   },
   {
    "mode": "home_trio",
    "gesture": "turn",
    "action": "Sets oscillator two interval.",
    "short_label": "TRIO INT2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "366",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L366"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "378",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L378"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "-24–24 raw",
    "parameter": "P_E1"
   },
   {
    "mode": "wheel_edit_1",
    "gesture": "turn",
    "action": "Offsets the high drawbar levels.",
    "short_label": "WHEEL TOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "291",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L291"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "287-296",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L287-L296"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "-8–8 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "wheel_edit_2",
    "gesture": "turn",
    "action": "Chooses rotary-speaker speed.",
    "short_label": "WHEEL ROTR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "295",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L295"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "64-64",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L64"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "287-296",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L287-L296"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–2 raw",
    "choices": [
     "OFF",
     "SLOW",
     "FAST"
    ],
    "parameter": "P_E7"
   },
   {
    "mode": "home_wheel",
    "gesture": "turn",
    "action": "Chooses rotary-speaker speed.",
    "short_label": "WHEEL ROTR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "295",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L295"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "64-64",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L64"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "301",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L301"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–2 raw",
    "choices": [
     "OFF",
     "SLOW",
     "FAST"
    ],
    "parameter": "P_E7"
   },
   {
    "mode": "grain_edit_1",
    "gesture": "turn",
    "action": "Sets how frequently grains begin.",
    "short_label": "GRAIN DENS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "450",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L450"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "446-455",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L446-L455"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "grain_edit_2",
    "gesture": "turn",
    "action": "Sets grain tone.",
    "short_label": "GRAIN TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "446-455",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L446-L455"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E7"
   },
   {
    "mode": "home_grain",
    "gesture": "turn",
    "action": "Sets random position spread.",
    "short_label": "GRAIN SPRD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "452",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L452"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "460",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L460"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E5"
   },
   {
    "mode": "phys_edit_1",
    "gesture": "turn",
    "action": "Sets model damping.",
    "short_label": "PHYS DAMP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "244",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L244"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "240-249",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L240-L249"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "phys_edit_2",
    "gesture": "turn",
    "action": "Sets direct exciter level.",
    "short_label": "PHYS EXC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "248",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L248"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "240-249",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L240-L249"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E7"
   },
   {
    "mode": "home_phys",
    "gesture": "turn",
    "action": "Sets the excitation position.",
    "short_label": "PHYS POS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "245",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L245"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "254",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L254"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "gurdy_edit_1",
    "gesture": "turn",
    "action": "Sets wheel pressure.",
    "short_label": "GURDY WHL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "224",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L224"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "220-229",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L220-L229"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "gurdy_edit_2",
    "gesture": "turn",
    "action": "Sets wheel pitch and level wander.",
    "short_label": "GURDY WOBL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "228",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L228"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "220-229",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L220-L229"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E7"
   },
   {
    "mode": "home_gurdy",
    "gesture": "turn",
    "action": "Sets the release time.",
    "short_label": "GURDY REL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "235",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L235"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "66",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L66"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127, displayed as time",
    "parameter": "P_REL"
   },
   {
    "mode": "noise_edit_1",
    "gesture": "turn",
    "action": "Sets noise resonance.",
    "short_label": "NOISE RES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "262",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L262"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "258-267",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L258-L267"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "noise_edit_2",
    "gesture": "turn",
    "action": "Sets noise degradation.",
    "short_label": "NOISE CRSH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "266",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L266"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "258-267",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L258-L267"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E7"
   },
   {
    "mode": "home_noise",
    "gesture": "turn",
    "action": "Sets the release time.",
    "short_label": "NOISE REL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "272",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L272"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "66",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L66"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127, displayed as time",
    "parameter": "P_REL"
   },
   {
    "mode": "drum_edit_1",
    "gesture": "turn",
    "action": "Sets the kit decay.",
    "short_label": "DRUM DECY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "337",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L337"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "333-342",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L333-L342"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "drum_edit_2",
    "gesture": "turn",
    "action": "Sets drum drive.",
    "short_label": "DRUM DRV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "341",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L341"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "333-342",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L333-L342"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E7"
   },
   {
    "mode": "home_drum",
    "gesture": "turn",
    "action": "Sets each drum extra attack character.",
    "short_label": "DRUM SNAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "338",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L338"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "348",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L348"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E4"
   },
   {
    "mode": "slice_edit_1",
    "gesture": "turn",
    "action": "Transposes slice playback.",
    "short_label": "SLICE PTCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "632",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L632"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "628-637",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L628-L637"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "-24–24 raw",
    "parameter": "P_E3"
   },
   {
    "mode": "slice_edit_2",
    "gesture": "turn",
    "action": "Sets slice tone.",
    "short_label": "SLICE TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "636",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L636"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "628-637",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L628-L637"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E7"
   },
   {
    "mode": "home_slice",
    "gesture": "turn",
    "action": "Sets slice decay.",
    "short_label": "SLICE DCAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "635",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L635"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "642",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L642"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "3-30",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L3-L30"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     }
    ],
    "range": "0–127 raw",
    "parameter": "P_E6"
   },
   {
    "mode": "lofi_edit_1_variant_4",
    "gesture": "turn",
    "action": "Chooses constant volume, a single decay, or repeating decay.",
    "short_label": "LOFI DCY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "42-56",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L42-L56"
     }
    ],
    "range": "0–127, distributed across CONST, D0–D15, L1–L15"
   },
   {
    "mode": "home_phys_variant_8",
    "gesture": "turn",
    "action": "Sets coupling into the sympathetic strings.",
    "short_label": "PHYS SYMP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "22-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L22-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "64-76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
     }
    ],
    "range": "0–100%"
   },
   {
    "mode": "noise_edit_2_variant_12",
    "gesture": "turn",
    "action": "Sets the register clock above the played key.",
    "short_label": "NOISE CLK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "8-14",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L8-L14"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "24-26",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L24-L26"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "45-52",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L45-L52"
     }
    ],
    "range": "0–127 semitones"
   },
   {
    "mode": "gurdy_edit_1_variant_13",
    "gesture": "turn",
    "action": "Sets how little crank movement gives full wheel pressure.",
    "short_label": "GURDY GEAR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "12-15",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L12-L15"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "210-215",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L210-L215"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "76-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L76-L83"
     }
    ],
    "range": "0–100%, higher requires less turning"
   },
   {
    "mode": "sleep",
    "gesture": "turn",
    "action": "Wakes the screen without changing a value.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "turn_cw",
    "action": "When this encoder is requested, records its physical position and clockwise direction.",
    "short_label": "TEACH KNOB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1786-1810",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1786-L1810"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "turn",
    "action": "Does nothing on INFO.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "turn",
    "action": "Does nothing on ABOUT.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "512-518",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L512-L518"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "turn",
    "action": "Does nothing while the confirmation is open.",
    "short_label": "NO TURN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1590-1592",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1590-L1592"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_g3",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_a3",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_b3",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_c4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_d4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_e4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_g4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_a4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_b4",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_c5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_d5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_e5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_g5",
    "action": "With an automatable parameter assigned to the remembered card, attempts a lock on every held step and keeps its hit; an unavailable card writes nothing and release can remove an existing hit.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_fs3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_g3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_gs3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_a3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_as3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_b3",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_c4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_cs4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_d4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_ds4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_e4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_f4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_fs4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_g4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_gs4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_a4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_as4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_b4",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_c5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_cs5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_d5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_ds5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_e5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_f5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_fs5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "turn_while_holding:key_g5",
    "action": "During armed, stopped entry, attempts a lock on the open step only if the remembered card has an automatable parameter, with unavailable cards writing nothing and song playback blocking edits.",
    "short_label": "STEP LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "turn",
    "action": "Sets the selected engine’s fourth main value shown on HOME, such as ANALOG release or FM6 patch slot.",
    "short_label": "MAIN 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1518-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1518-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1719-1723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1719-L1723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "887-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L887-L895"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "207",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L207"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "66",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L66"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "19-23",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L19-L23"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "441",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L441"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "447",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L447"
     }
    ]
   }
  ],
  "knob_master": [
   {
    "mode": "any",
    "gesture": "turn",
    "action": "Sets speaker and headphone level, also changing USB audio level unless MENU > USB LEVEL is FIXED.",
    "short_label": "VOLUME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/fx.c",
      "lines": "111-123",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/fx.c#L111-L123"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/audio.c",
      "lines": "27-35",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/audio.c#L27-L35"
     }
    ]
   }
  ],
  "key_f3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY F3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Toggles the selected drum lane at step 1 of the visible 16-step bank within LEN, with removal deferred until release so held locks keep the hit.",
    "short_label": "STEP 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-658",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-697",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L697"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_cs5",
    "action": "Toggles the selected lane’s accent at step 1 of the visible bank, adding a hit if an accent is added to an empty step.",
    "short_label": "ACCENT 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "557-573",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L557-L573"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Targets this held step for locks or nudging, but a lock turn on an unavailable parameter leaves an existing hit pending removal at release.",
    "short_label": "LOCK TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "With the default assignment, applies repeat 1/8 while held, or toggles it when FX LATCH is on.",
    "short_label": "REPEAT 1/8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "72-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L72-L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Solos track 1 while held, combining with other held solo keys.",
    "short_label": "SOLO 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to F regardless of the octave setting.",
    "short_label": "ROOT F",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses the ANALOG engine with its first preset when changing engines.",
    "short_label": "ANALOG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Clears the track’s steps within LEN and their locks immediately, keeping ordinary automation.",
    "short_label": "CLEAR STEPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "350-354",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L350-L354"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "412",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L412"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Immediately clears the track’s steps and automation with a SAVE-held undo while song playback is stopped.",
    "short_label": "CLEAR TRACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-428",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L428"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cycles the characters AB in ABC mode, or types 1 in number mode, without sounding a note.",
    "short_label": "TYPE AB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays a scale degree according to this white key’s position.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 29 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 29",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_fs3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY F#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Selects and plays drum lane 1, recording the hit when the track is armed and running.",
    "short_label": "LANE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "653-656",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L653-L656"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "780-790",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L780-L790"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Silences track 1 while held, or toggles its performance mute with FX LATCH on.",
    "short_label": "FX MUTE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Toggles track 1’s saved mute setting.",
    "short_label": "TRACK MUTE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to F# regardless of the octave setting.",
    "short_label": "ROOT F#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "On DRUM, toggles the performance mute for lane 1.",
    "short_label": "LANE MUTE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "On DRUM, selects lane 1 for the lane tools.",
    "short_label": "LANE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Moves the name cursor left.",
    "short_label": "NAME LEFT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays no note with WHITE quantization unless the engine provides its own keyboard map.",
    "short_label": "SILENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 30 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 30",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "long_press",
    "action": "Repeats this cursor or backspace action after 450 ms, then every 90 ms.",
    "short_label": "NAME REPEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L31"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "292-303",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L292-L303"
     }
    ]
   }
  ],
  "key_g3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY G3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Toggles the selected drum lane at step 2 of the visible 16-step bank within LEN, with removal deferred until release so held locks keep the hit.",
    "short_label": "STEP 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-658",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-697",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L697"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_cs5",
    "action": "Toggles the selected lane’s accent at step 2 of the visible bank, adding a hit if an accent is added to an empty step.",
    "short_label": "ACCENT 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "557-573",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L557-L573"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Targets this held step for locks or nudging, but a lock turn on an unavailable parameter leaves an existing hit pending removal at release.",
    "short_label": "LOCK TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "With the default assignment, applies repeat 1/16 while held, or toggles it when FX LATCH is on.",
    "short_label": "REPEAT 1/16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "72-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L72-L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Solos track 2 while held, combining with other held solo keys.",
    "short_label": "SOLO 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to G regardless of the octave setting.",
    "short_label": "ROOT G",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses the FM6 engine with its first preset when changing engines.",
    "short_label": "FM6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Reverses the track’s steps within LEN with their automation and locks.",
    "short_label": "REVERSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Cycles click through OFF, REC and ON.",
    "short_label": "CYCLE CLICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cycles the characters CD in ABC mode, or types 2 in number mode, without sounding a note.",
    "short_label": "TYPE CD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays a scale degree according to this white key’s position.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 31 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 31",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_gs3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY G#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Selects and plays drum lane 2, recording the hit when the track is armed and running.",
    "short_label": "LANE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "653-656",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L653-L656"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "780-790",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L780-L790"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Silences track 2 while held, or toggles its performance mute with FX LATCH on.",
    "short_label": "FX MUTE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Toggles track 2’s saved mute setting.",
    "short_label": "TRACK MUTE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to G# regardless of the octave setting.",
    "short_label": "ROOT G#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "On DRUM, toggles the performance mute for lane 2.",
    "short_label": "LANE MUTE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "On DRUM, selects lane 2 for the lane tools.",
    "short_label": "LANE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types a space and advances.",
    "short_label": "SPACE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays no note with WHITE quantization unless the engine provides its own keyboard map.",
    "short_label": "SILENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 32 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 32",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_a3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY A3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Toggles the selected drum lane at step 3 of the visible 16-step bank within LEN, with removal deferred until release so held locks keep the hit.",
    "short_label": "STEP 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-658",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-697",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L697"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_cs5",
    "action": "Toggles the selected lane’s accent at step 3 of the visible bank, adding a hit if an accent is added to an empty step.",
    "short_label": "ACCENT 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "557-573",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L557-L573"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Targets this held step for locks or nudging, but a lock turn on an unavailable parameter leaves an existing hit pending removal at release.",
    "short_label": "LOCK TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Assigns pattern A to the selected song cell, creating a row on + ADD while song playback is stopped.",
    "short_label": "PATTERN A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "508-526",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L508-L526"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "80-87",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L80-L87"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "With the default assignment, applies repeat 1/32 while held, or toggles it when FX LATCH is on.",
    "short_label": "REPEAT 1/32",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "72-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L72-L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Solos track 3 while held, combining with other held solo keys.",
    "short_label": "SOLO 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to A regardless of the octave setting.",
    "short_label": "ROOT A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses the PHASE engine with its first preset when changing engines.",
    "short_label": "PHASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Rotates the sequence one step earlier within LEN with its automation and locks.",
    "short_label": "SHIFT LEFT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Cycles count-in through OFF, one bar and two bars.",
    "short_label": "CYCLE COUNT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cycles the characters EF in ABC mode, or types 3 in number mode, without sounding a note.",
    "short_label": "TYPE EF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays a scale degree according to this white key’s position.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 33 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 33",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_as3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY A#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Selects and plays drum lane 3, recording the hit when the track is armed and running.",
    "short_label": "LANE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "653-656",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L653-L656"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "780-790",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L780-L790"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Silences track 3 while held, or toggles its performance mute with FX LATCH on.",
    "short_label": "FX MUTE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Toggles track 3’s saved mute setting.",
    "short_label": "TRACK MUTE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to A# regardless of the octave setting.",
    "short_label": "ROOT A#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "On DRUM, toggles the performance mute for lane 3.",
    "short_label": "LANE MUTE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "On DRUM, selects lane 3 for the lane tools.",
    "short_label": "LANE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Moves the name cursor right.",
    "short_label": "NAME RIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays no note with WHITE quantization unless the engine provides its own keyboard map.",
    "short_label": "SILENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 34 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 34",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "long_press",
    "action": "Repeats this cursor or backspace action after 450 ms, then every 90 ms.",
    "short_label": "NAME REPEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L31"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "292-303",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L292-L303"
     }
    ]
   }
  ],
  "key_b3": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY B3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Toggles the selected drum lane at step 4 of the visible 16-step bank within LEN, with removal deferred until release so held locks keep the hit.",
    "short_label": "STEP 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-658",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-697",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L697"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_cs5",
    "action": "Toggles the selected lane’s accent at step 4 of the visible bank, adding a hit if an accent is added to an empty step.",
    "short_label": "ACCENT 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "557-573",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L557-L573"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Targets this held step for locks or nudging, but a lock turn on an unavailable parameter leaves an existing hit pending removal at release.",
    "short_label": "LOCK TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Assigns pattern B to the selected song cell, creating a row on + ADD while song playback is stopped.",
    "short_label": "PATTERN B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "508-526",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L508-L526"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "80-87",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L80-L87"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "With the default assignment, applies reverse while held, or toggles it when FX LATCH is on.",
    "short_label": "REVERSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "72-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L72-L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Solos track 4 while held, combining with other held solo keys.",
    "short_label": "SOLO 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to B regardless of the octave setting.",
    "short_label": "ROOT B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses the LOFI engine with its first preset when changing engines.",
    "short_label": "LOFI",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Rotates the sequence one step later within LEN with its automation and locks.",
    "short_label": "SHIFT RIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Cycles click level through low, medium and high.",
    "short_label": "CYCLE LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cycles the characters GH in ABC mode, or types 4 in number mode, without sounding a note.",
    "short_label": "TYPE GH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays a scale degree according to this white key’s position.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 35 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 35",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_c4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Toggles the selected drum lane at step 5 of the visible 16-step bank within LEN, with removal deferred until release so held locks keep the hit.",
    "short_label": "STEP 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-658",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-697",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L697"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_cs5",
    "action": "Toggles the selected lane’s accent at step 5 of the visible bank, adding a hit if an accent is added to an empty step.",
    "short_label": "ACCENT 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "557-573",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L557-L573"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Targets this held step for locks or nudging, but a lock turn on an unavailable parameter leaves an existing hit pending removal at release.",
    "short_label": "LOCK TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Assigns pattern C to the selected song cell, creating a row on + ADD while song playback is stopped.",
    "short_label": "PATTERN C",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "508-526",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L508-L526"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "80-87",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L80-L87"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "With the default assignment, applies low-pass while held, or toggles it when FX LATCH is on.",
    "short_label": "LOW-PASS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "72-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L72-L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Clears all four track mute settings.",
    "short_label": "UNMUTE ALL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to C regardless of the octave setting.",
    "short_label": "ROOT C",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses the SAMPLE engine with its first preset when changing engines.",
    "short_label": "SAMPLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Replaces the track’s steps within LEN with a generated pattern.",
    "short_label": "RANDOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cycles the characters IJK in ABC mode, or types 5 in number mode, without sounding a note.",
    "short_label": "TYPE IJK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays a scale degree according to this white key’s position.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 36 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 36",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_cs4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY C#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Selects and plays drum lane 4, recording the hit when the track is armed and running.",
    "short_label": "LANE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "653-656",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L653-L656"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "780-790",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L780-L790"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Silences track 4 while held, or toggles its performance mute with FX LATCH on.",
    "short_label": "FX MUTE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Toggles track 4’s saved mute setting.",
    "short_label": "TRACK MUTE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to C# regardless of the octave setting.",
    "short_label": "ROOT C#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "On DRUM, toggles the performance mute for lane 4.",
    "short_label": "LANE MUTE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "On DRUM, selects lane 4 for the lane tools.",
    "short_label": "LANE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Deletes the character before the cursor.",
    "short_label": "BACKSPACE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays no note with WHITE quantization unless the engine provides its own keyboard map.",
    "short_label": "SILENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 37 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 37",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "long_press",
    "action": "Repeats this cursor or backspace action after 450 ms, then every 90 ms.",
    "short_label": "NAME REPEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L31"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "292-303",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L292-L303"
     }
    ]
   }
  ],
  "key_d4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY D4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Toggles the selected drum lane at step 6 of the visible 16-step bank within LEN, with removal deferred until release so held locks keep the hit.",
    "short_label": "STEP 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-658",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-697",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L697"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_cs5",
    "action": "Toggles the selected lane’s accent at step 6 of the visible bank, adding a hit if an accent is added to an empty step.",
    "short_label": "ACCENT 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "557-573",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L557-L573"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Targets this held step for locks or nudging, but a lock turn on an unavailable parameter leaves an existing hit pending removal at release.",
    "short_label": "LOCK TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Assigns pattern D to the selected song cell, creating a row on + ADD while song playback is stopped.",
    "short_label": "PATTERN D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "508-526",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L508-L526"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "80-87",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L80-L87"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "With the default assignment, applies high-pass while held, or toggles it when FX LATCH is on.",
    "short_label": "HIGH-PASS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "72-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L72-L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to D regardless of the octave setting.",
    "short_label": "ROOT D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses the VOICE engine with its first preset when changing engines.",
    "short_label": "VOICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Changes a few notes or drum hits within LEN.",
    "short_label": "COOK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cycles the characters LM in ABC mode, or types 6 in number mode, without sounding a note.",
    "short_label": "TYPE LM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays a scale degree according to this white key’s position.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 38 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 38",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_ds4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY D#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Selects and plays drum lane 5, recording the hit when the track is armed and running.",
    "short_label": "LANE 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "653-656",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L653-L656"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "780-790",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L780-L790"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-616",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L616"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to D# regardless of the octave setting.",
    "short_label": "ROOT D#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "On DRUM, toggles the performance mute for lane 5.",
    "short_label": "LANE MUTE 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "On DRUM, selects lane 5 for the lane tools.",
    "short_label": "LANE 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Switches between letter groups and numeric symbols.",
    "short_label": "ABC / 123",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays no note with WHITE quantization unless the engine provides its own keyboard map.",
    "short_label": "SILENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 39 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 39",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_e4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY E4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Toggles the selected drum lane at step 7 of the visible 16-step bank within LEN, with removal deferred until release so held locks keep the hit.",
    "short_label": "STEP 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-658",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-697",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L697"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_cs5",
    "action": "Toggles the selected lane’s accent at step 7 of the visible bank, adding a hit if an accent is added to an empty step.",
    "short_label": "ACCENT 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "557-573",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L557-L573"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Targets this held step for locks or nudging, but a lock turn on an unavailable parameter leaves an existing hit pending removal at release.",
    "short_label": "LOCK TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "With the default assignment, applies tape stop while held, or toggles it when FX LATCH is on.",
    "short_label": "TAPE STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "72-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L72-L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to E regardless of the octave setting.",
    "short_label": "ROOT E",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses the TRIO engine with its first preset when changing engines.",
    "short_label": "TRIO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "On DRUM, replaces steps within LEN with kick every fourth step, snare on the backbeat and closed hats every second step.",
    "short_label": "BEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cycles the characters NO in ABC mode, or types 7 in number mode, without sounding a note.",
    "short_label": "TYPE NO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays a scale degree according to this white key’s position.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 40 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 40",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_f4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY F4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Toggles the selected drum lane at step 8 of the visible 16-step bank within LEN, with removal deferred until release so held locks keep the hit.",
    "short_label": "STEP 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-658",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-697",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L697"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_cs5",
    "action": "Toggles the selected lane’s accent at step 8 of the visible bank, adding a hit if an accent is added to an empty step.",
    "short_label": "ACCENT 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "557-573",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L557-L573"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Targets this held step for locks or nudging, but a lock turn on an unavailable parameter leaves an existing hit pending removal at release.",
    "short_label": "LOCK TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "With the default assignment, applies freeze while held, or toggles it when FX LATCH is on.",
    "short_label": "FREEZE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "72-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L72-L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Sets internal tempo from the third tap onward using up to four taps, restarting the tap count after two seconds.",
    "short_label": "TAP TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to F regardless of the octave setting.",
    "short_label": "ROOT F",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses the WHEEL engine with its first preset when changing engines.",
    "short_label": "WHEEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cycles the characters PQ in ABC mode, or types 8 in number mode, without sounding a note.",
    "short_label": "TYPE PQ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays a scale degree according to this white key’s position.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 41 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 41",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_fs4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY F#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Selects and plays drum lane 6, recording the hit when the track is armed and running.",
    "short_label": "LANE 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "653-656",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L653-L656"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "780-790",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L780-L790"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-616",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L616"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Toggles drone latch on track 1, unavailable for DRUM and inactive while its arp is on.",
    "short_label": "DRONE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to F# regardless of the octave setting.",
    "short_label": "ROOT F#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "On DRUM, toggles the performance mute for lane 6.",
    "short_label": "LANE MUTE 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "On DRUM, selects lane 6 for the lane tools.",
    "short_label": "LANE 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Moves the name cursor left.",
    "short_label": "NAME LEFT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays no note with WHITE quantization unless the engine provides its own keyboard map.",
    "short_label": "SILENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 42 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 42",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "long_press",
    "action": "Repeats this cursor or backspace action after 450 ms, then every 90 ms.",
    "short_label": "NAME REPEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L31"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "292-303",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L292-L303"
     }
    ]
   }
  ],
  "key_g4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY G4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Toggles the selected drum lane at step 9 of the visible 16-step bank within LEN, with removal deferred until release so held locks keep the hit.",
    "short_label": "STEP 9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-658",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-697",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L697"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_cs5",
    "action": "Toggles the selected lane’s accent at step 9 of the visible bank, adding a hit if an accent is added to an empty step.",
    "short_label": "ACCENT 9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "557-573",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L557-L573"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Targets this held step for locks or nudging, but a lock turn on an unavailable parameter leaves an existing hit pending removal at release.",
    "short_label": "LOCK TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "With the default assignment, applies oct up while held, or toggles it when FX LATCH is on.",
    "short_label": "OCT UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "72-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L72-L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to G regardless of the octave setting.",
    "short_label": "ROOT G",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses the GRAIN engine with its first preset when changing engines.",
    "short_label": "GRAIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "On DRUM, removes hits of the selected lane within LEN.",
    "short_label": "LANE CLEAR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cycles the characters RS in ABC mode, or types 9 in number mode, without sounding a note.",
    "short_label": "TYPE RS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays a scale degree according to this white key’s position.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 43 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 43",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_gs4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY G#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Selects and plays drum lane 7, recording the hit when the track is armed and running.",
    "short_label": "LANE 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "653-656",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L653-L656"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "780-790",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L780-L790"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-616",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L616"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Toggles drone latch on track 2, unavailable for DRUM and inactive while its arp is on.",
    "short_label": "DRONE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to G# regardless of the octave setting.",
    "short_label": "ROOT G#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "On DRUM, toggles the performance mute for lane 7.",
    "short_label": "LANE MUTE 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "On DRUM, selects lane 7 for the lane tools.",
    "short_label": "LANE 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types a space and advances.",
    "short_label": "SPACE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays no note with WHITE quantization unless the engine provides its own keyboard map.",
    "short_label": "SILENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 44 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 44",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_a4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY A4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Toggles the selected drum lane at step 10 of the visible 16-step bank within LEN, with removal deferred until release so held locks keep the hit.",
    "short_label": "STEP 10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-658",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-697",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L697"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_cs5",
    "action": "Toggles the selected lane’s accent at step 10 of the visible bank, adding a hit if an accent is added to an empty step.",
    "short_label": "ACCENT 10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "557-573",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L557-L573"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Targets this held step for locks or nudging, but a lock turn on an unavailable parameter leaves an existing hit pending removal at release.",
    "short_label": "LOCK TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "With the default assignment, applies oct down while held, or toggles it when FX LATCH is on.",
    "short_label": "OCT DOWN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "72-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L72-L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to A regardless of the octave setting.",
    "short_label": "ROOT A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses the PHYS engine with its first preset when changing engines.",
    "short_label": "PHYS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "On DRUM, reverses the selected lane’s hits within LEN.",
    "short_label": "LANE REVERSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cycles the characters TU in ABC mode, or types 0 in number mode, without sounding a note.",
    "short_label": "TYPE TU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays a scale degree according to this white key’s position.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 45 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 45",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_as4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY A#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Selects and plays drum lane 8, recording the hit when the track is armed and running.",
    "short_label": "LANE 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "653-656",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L653-L656"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "780-790",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L780-L790"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-616",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L616"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Toggles drone latch on track 3, unavailable for DRUM and inactive while its arp is on.",
    "short_label": "DRONE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to A# regardless of the octave setting.",
    "short_label": "ROOT A#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "On DRUM, toggles the performance mute for lane 8.",
    "short_label": "LANE MUTE 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "On DRUM, selects lane 8 for the lane tools.",
    "short_label": "LANE 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Moves the name cursor right.",
    "short_label": "NAME RIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays no note with WHITE quantization unless the engine provides its own keyboard map.",
    "short_label": "SILENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 46 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 46",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "long_press",
    "action": "Repeats this cursor or backspace action after 450 ms, then every 90 ms.",
    "short_label": "NAME REPEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L31"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "292-303",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L292-L303"
     }
    ]
   }
  ],
  "key_b4": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY B4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Toggles the selected drum lane at step 11 of the visible 16-step bank within LEN, with removal deferred until release so held locks keep the hit.",
    "short_label": "STEP 11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-658",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-697",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L697"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_cs5",
    "action": "Toggles the selected lane’s accent at step 11 of the visible bank, adding a hit if an accent is added to an empty step.",
    "short_label": "ACCENT 11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "557-573",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L557-L573"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Targets this held step for locks or nudging, but a lock turn on an unavailable parameter leaves an existing hit pending removal at release.",
    "short_label": "LOCK TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "With the default assignment, applies flanger while held, or toggles it when FX LATCH is on.",
    "short_label": "FLANGER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "72-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L72-L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to B regardless of the octave setting.",
    "short_label": "ROOT B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses the GURDY engine with its first preset when changing engines.",
    "short_label": "GURDY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "On DRUM, cycles the lane through every step, every second step, every fourth step and empty.",
    "short_label": "LANE FILL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cycles the characters VW in ABC mode, or types - in number mode, without sounding a note.",
    "short_label": "TYPE VW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays a scale degree according to this white key’s position.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 47 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 47",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_c5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY C5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Toggles the selected drum lane at step 12 of the visible 16-step bank within LEN, with removal deferred until release so held locks keep the hit.",
    "short_label": "STEP 12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-658",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-697",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L697"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_cs5",
    "action": "Toggles the selected lane’s accent at step 12 of the visible bank, adding a hit if an accent is added to an empty step.",
    "short_label": "ACCENT 12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "557-573",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L557-L573"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Targets this held step for locks or nudging, but a lock turn on an unavailable parameter leaves an existing hit pending removal at release.",
    "short_label": "LOCK TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "With the default assignment, applies phaser while held, or toggles it when FX LATCH is on.",
    "short_label": "PHASER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "72-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L72-L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to C regardless of the octave setting.",
    "short_label": "ROOT C",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses the NOISE engine with its first preset when changing engines.",
    "short_label": "NOISE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "On DRUM, generates hits for the selected lane within LEN.",
    "short_label": "LANE RANDOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cycles the characters XYZ in ABC mode, or types . in number mode, without sounding a note.",
    "short_label": "TYPE XYZ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays a scale degree according to this white key’s position.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 48 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 48",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_cs5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY C#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Makes the white step keys edit accents and their lights show accents.",
    "short_label": "ACCENTS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "125-141",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L125-L141"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-616",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L616"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Toggles drone latch on track 4, unavailable for DRUM and inactive while its arp is on.",
    "short_label": "DRONE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to C# regardless of the octave setting.",
    "short_label": "ROOT C#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Deletes the character before the cursor.",
    "short_label": "BACKSPACE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays no note with WHITE quantization unless the engine provides its own keyboard map.",
    "short_label": "SILENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 49 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 49",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "long_press",
    "action": "Repeats this cursor or backspace action after 450 ms, then every 90 ms.",
    "short_label": "NAME REPEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L31"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "292-303",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L292-L303"
     }
    ]
   }
  ],
  "key_d5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY D5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Toggles the selected drum lane at step 13 of the visible 16-step bank within LEN, with removal deferred until release so held locks keep the hit.",
    "short_label": "STEP 13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-658",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-697",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L697"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_cs5",
    "action": "Toggles the selected lane’s accent at step 13 of the visible bank, adding a hit if an accent is added to an empty step.",
    "short_label": "ACCENT 13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "557-573",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L557-L573"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Targets this held step for locks or nudging, but a lock turn on an unavailable parameter leaves an existing hit pending removal at release.",
    "short_label": "LOCK TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "With the default assignment, does nothing until an effect is assigned.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "72-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L72-L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to D regardless of the octave setting.",
    "short_label": "ROOT D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses the DRUM engine with its first preset when changing engines.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cycles the characters 123 in ABC mode, or types _ in number mode, without sounding a note.",
    "short_label": "TYPE 123",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays a scale degree according to this white key’s position.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 50 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 50",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_ds5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY D#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Moves to the previous 16-step bank, wrapping within LEN.",
    "short_label": "PAGE BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "600-607",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L600-L607"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "653-656",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L653-L656"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-616",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L616"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to D# regardless of the octave setting.",
    "short_label": "ROOT D#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Switches between letter groups and numeric symbols.",
    "short_label": "ABC / 123",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays no note with WHITE quantization unless the engine provides its own keyboard map.",
    "short_label": "SILENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 51 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 51",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_e5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY E5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Toggles the selected drum lane at step 14 of the visible 16-step bank within LEN, with removal deferred until release so held locks keep the hit.",
    "short_label": "STEP 14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-658",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-697",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L697"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_cs5",
    "action": "Toggles the selected lane’s accent at step 14 of the visible bank, adding a hit if an accent is added to an empty step.",
    "short_label": "ACCENT 14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "557-573",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L557-L573"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Targets this held step for locks or nudging, but a lock turn on an unavailable parameter leaves an existing hit pending removal at release.",
    "short_label": "LOCK TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "With the default assignment, does nothing until an effect is assigned.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "72-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L72-L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to E regardless of the octave setting.",
    "short_label": "ROOT E",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Asks before resetting this track’s sound to its engine defaults while song playback is stopped.",
    "short_label": "INITIALIZE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cycles the characters 456 in ABC mode, or types / in number mode, without sounding a note.",
    "short_label": "TYPE 456",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays a scale degree according to this white key’s position.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 52 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 52",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_f5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY F5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Toggles the selected drum lane at step 15 of the visible 16-step bank within LEN, with removal deferred until release so held locks keep the hit.",
    "short_label": "STEP 15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-658",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-697",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L697"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_cs5",
    "action": "Toggles the selected lane’s accent at step 15 of the visible bank, adding a hit if an accent is added to an empty step.",
    "short_label": "ACCENT 15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "557-573",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L557-L573"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Targets this held step for locks or nudging, but a lock turn on an unavailable parameter leaves an existing hit pending removal at release.",
    "short_label": "LOCK TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "With the default assignment, does nothing until an effect is assigned.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "72-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L72-L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to F regardless of the octave setting.",
    "short_label": "ROOT F",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cycles the characters 789 in ABC mode, or types # in number mode, without sounding a note.",
    "short_label": "TYPE 789",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays a scale degree according to this white key’s position.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 53 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 53",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "key_fs5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY F#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Moves to the next 16-step bank, wrapping within LEN.",
    "short_label": "PAGE NEXT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "600-607",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L600-L607"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "653-656",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L653-L656"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-616",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L616"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to F# regardless of the octave setting.",
    "short_label": "ROOT F#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Moves the name cursor left.",
    "short_label": "NAME LEFT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays no note with WHITE quantization unless the engine provides its own keyboard map.",
    "short_label": "SILENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 54 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 54",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "long_press",
    "action": "Repeats this cursor or backspace action after 450 ms, then every 90 ms.",
    "short_label": "NAME REPEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-31",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L31"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "292-303",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L292-L303"
     }
    ]
   }
  ],
  "key_g5": [
   {
    "mode": "any",
    "gesture": "press",
    "action": "Outside key maps, plays the selected track at this key’s mapped pitch, following octave, transposition, scale, chord and arp settings.",
    "short_label": "PLAY G5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "744-816",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L744-L816"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "press",
    "action": "Writes this key’s mapped note or chord into the cursor step, up to four notes in POLY, or toggles its notes with CHORD ENTRY ADD.",
    "short_label": "WRITE STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1015-1051",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1015-L1051"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1060-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1060-L1103"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "release",
    "action": "When all note keys are up, advances one step unless CHORD ENTRY ADD is enabled.",
    "short_label": "NEXT STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1098-1103",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1098-L1103"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Toggles the selected drum lane at step 16 of the visible 16-step bank within LEN, with removal deferred until release so held locks keep the hit.",
    "short_label": "STEP 16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-658",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L658"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-697",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L697"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press_while_holding:key_cs5",
    "action": "Toggles the selected lane’s accent at step 16 of the visible bank, adding a hit if an accent is added to an empty step.",
    "short_label": "ACCENT 16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "623-651",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L623-L651"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "557-573",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L557-L573"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "Targets this held step for locks or nudging, but a lock turn on an unavailable parameter leaves an existing hit pending removal at release.",
    "short_label": "LOCK TARGET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "669-726",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L669-L726"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "746-773",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L746-L773"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/motion.c",
      "lines": "34-42",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "449-465",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "637-645",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "685-724",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "With the default assignment, does nothing until an effect is assigned.",
    "short_label": "NONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "72-89",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L72-L89"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "611-640",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L611-L640"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/perform.c",
      "lines": "175-193",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/perform.c#L175-L193"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "637-650",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L637-L650"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "609-627",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L609-L627"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "355-375",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L355-L375"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the selected track’s root to G regardless of the octave setting.",
    "short_label": "ROOT G",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "651-652",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L651-L652"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "653-661",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L653-L661"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "535-565",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L535-L565"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/engines.c",
      "lines": "115-129",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L115-L129"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_tools.c",
      "lines": "345-414",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_tools.c#L345-L414"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "665-669",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L665-L669"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this key map.",
    "short_label": "UNUSED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "405-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L405-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "662-664",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L662-L664"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cycles the characters 0-. in ABC mode, or types + in number mode, without sounding a note.",
    "short_label": "TYPE 0-.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "29-36",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L29-L36"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "64-81",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L64-L81"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "147-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L147-L198"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and keeps the previous wiring map.",
    "short_label": "CANCEL SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1731-1735",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1731-L1735"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1814-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1814-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "press",
    "action": "Wakes the screen without playing a note or editing a step.",
    "short_label": "WAKE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "250-271",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L250-L271"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays the slice assigned to this key and selects its start marker on SLICES.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "press",
    "action": "Plays this key on the selected track and the second track if different, using each track’s own map and the second track’s OCT where supported.",
    "short_label": "PLAY LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "press",
    "action": "Plays the second track below SPLT or the selected track from SPLT upward, using the destination track’s map.",
    "short_label": "PLAY SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "710-723",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L710-L723"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "784-814",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L784-L814"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "press",
    "action": "Plays a scale degree according to this white key’s position.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "104-138",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L104-L138"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "press",
    "action": "Plays percussion note 55 plus the global octave shift, with the selected kit choosing its sound.",
    "short_label": "DRUM 55",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "74-108",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L74-L108"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "315-320",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L315-L320"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "press",
    "action": "After all keys are up, the next press stops the drone only if its first arriving note was already latched, otherwise replacing it and adding later notes.",
    "short_label": "DRONE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "542-599",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L542-L599"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "568-579",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L568-L579"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "671-682",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L671-L682"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/chord.c",
      "lines": "121-131",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/chord.c#L121-L131"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "release",
    "action": "Leaves the drone sounding after all physical keys are up.",
    "short_label": "DRONE HOLDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/seq.c",
      "lines": "593-608",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/seq.c#L593-L608"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/voice.c",
      "lines": "432-436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/voice.c#L432-L436"
     }
    ]
   }
  ],
  "screen": [
   {
    "mode": "env",
    "gesture": "shows",
    "action": "Shows the envelope curve.",
    "short_label": "ENV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "419-420",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L419-L420"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "env_dest",
    "gesture": "shows",
    "action": "Shows ENV DEST with its four control cards and the page graph or scope.",
    "short_label": "ENV DEST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "420-421",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L420-L421"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "shows",
    "action": "Shows the LFO waveform; RATE is dim and does nothing while SYNC is active.",
    "short_label": "LFO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "421-422",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L421-L422"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1174-1178",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1174-L1178"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "lfo_2",
    "gesture": "shows",
    "action": "Shows the LFO waveform.",
    "short_label": "LFO 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "422-423",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L422-L423"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "lfo_dest",
    "gesture": "shows",
    "action": "Shows LFO DEST with its four control cards and the page graph or scope.",
    "short_label": "LFO DEST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "423-424",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L423-L424"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "mod",
    "gesture": "shows",
    "action": "Shows modulation routes and their values.",
    "short_label": "MOD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "424-425",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L424-L425"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "487-490",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L487-L490"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1079-1089",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1079-L1089"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "fx",
    "gesture": "shows",
    "action": "Shows the four effect amounts.",
    "short_label": "FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "425-426",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L425-L426"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "slicer",
    "gesture": "shows",
    "action": "Shows the rhythmic pattern.",
    "short_label": "SLICER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "426-427",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L426-L427"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "delay",
    "gesture": "shows",
    "action": "Shows DLY with its four control cards and the page graph or scope.",
    "short_label": "DLY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "427-428",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L427-L428"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "reverb",
    "gesture": "shows",
    "action": "Shows REVERB with its four control cards and the page graph or scope.",
    "short_label": "REVERB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "428-429",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L428-L429"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "chorus",
    "gesture": "shows",
    "action": "Shows CHORUS with its four control cards and the page graph or scope.",
    "short_label": "CHORUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "429-430",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L429-L430"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "tape",
    "gesture": "shows",
    "action": "Shows TAPE with its four control cards and the page graph or scope.",
    "short_label": "TAPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "430-431",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L430-L431"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "scale",
    "gesture": "shows",
    "action": "Shows the scale.",
    "short_label": "SCL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "431-432",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L431-L432"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "chord",
    "gesture": "shows",
    "action": "Shows the chord.",
    "short_label": "CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "432-433",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L432-L433"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "lanes",
    "gesture": "shows",
    "action": "Shows LANES with its four control cards and the page graph or scope.",
    "short_label": "LANES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "436-437",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L436-L437"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "lanes_2",
    "gesture": "shows",
    "action": "Shows LANES 2 with its four control cards and the page graph or scope.",
    "short_label": "LANES 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "437-438",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L437-L438"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "voice",
    "gesture": "shows",
    "action": "Shows VOICE with its four control cards and the page graph or scope.",
    "short_label": "VOICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "447-448",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L447-L448"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "voice_2",
    "gesture": "shows",
    "action": "Shows VOICE 2 with its four control cards and the page graph or scope.",
    "short_label": "VOICE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "448-449",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "voice_3",
    "gesture": "shows",
    "action": "Shows VOICE 3 with its four control cards and the page graph or scope.",
    "short_label": "VOICE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "449-450",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L449-L450"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "shows",
    "action": "Shows sections, four track cells, project names, and repeats.",
    "short_label": "SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "451-452",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L451-L452"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "897-913",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L897-L913"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "presets",
    "gesture": "shows",
    "action": "Shows a scrollable sound list.",
    "short_label": "PRESETS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "452-453",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L452-L453"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1012-1023",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1012-L1023"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "shows",
    "action": "Shows user preset slots; press OCT+ to carry out the selected action.",
    "short_label": "USER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "453-454",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L453-L454"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1035-1042",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1035-L1042"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "phrases",
    "gesture": "shows",
    "action": "Shows factory and stored user patterns; OCT+ loads the selected pattern.",
    "short_label": "PHRASES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "454-455",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L454-L455"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1025-1033",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1025-L1033"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "shows",
    "action": "Shows four project slots and their names.",
    "short_label": "PROJECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "456-457",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L456-L457"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "tools",
    "gesture": "shows",
    "action": "Displays TURN TO PICK and the OCT+ confirmation hint.",
    "short_label": "TOOLS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "457-458",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L457-L458"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "991-995",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L991-L995"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2285-2288",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2285-L2288"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "shows",
    "action": "Shows ARP with its four control cards and the page graph or scope.",
    "short_label": "ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "458-459",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L458-L459"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "arp_2",
    "gesture": "shows",
    "action": "Shows ARP 2 with its four control cards and the page graph or scope.",
    "short_label": "ARP 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "459-460",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L459-L460"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "shows",
    "action": "Shows all four tracks with levels and meters.",
    "short_label": "MIXER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "465-466",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L465-L466"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "997-1010",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L997-L1010"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "clock",
    "gesture": "shows",
    "action": "Shows CLOCK with its four control cards and the page graph or scope.",
    "short_label": "CLOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "466-467",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L466-L467"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "keys",
    "gesture": "shows",
    "action": "Shows KEYS with its four control cards and the page graph or scope.",
    "short_label": "KEYS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "467-468",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L467-L468"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "fm6_operator",
    "gesture": "shows",
    "action": "Shows the FM6 algorithm and selected operator, or the operator envelope on OP ENV.",
    "short_label": "OPERATOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "439-440",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L439-L440"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "124-190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "fm6_op_env",
    "gesture": "shows",
    "action": "Shows the FM6 algorithm and selected operator, or the operator envelope on OP ENV.",
    "short_label": "OP ENV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "440-441",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L440-L441"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "124-190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "fm6_operator_2",
    "gesture": "shows",
    "action": "Shows the FM6 algorithm and selected operator, or the operator envelope on OP ENV.",
    "short_label": "OPERATOR 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "441-442",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L441-L442"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_fm6op.c",
      "lines": "124-190",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_fm6op.c#L124-L190"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "shows",
    "action": "Shows the waveform and slice boundaries; built-in material is viewable but cannot be edited.",
    "short_label": "SLICES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "438-439",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L438-L439"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "78-123",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L78-L123"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1044-1062",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1044-L1062"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "analog_edit_1",
    "gesture": "shows",
    "action": "Shows OSC with its four control cards and the page graph or scope.",
    "short_label": "OSC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "192-201",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L192-L201"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "analog_edit_2",
    "gesture": "shows",
    "action": "Shows FLT with its four control cards and the page graph or scope.",
    "short_label": "FLT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "192-201",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L192-L201"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "home_analog",
    "gesture": "shows",
    "action": "Four parameter cards above a scope, or a four-track overview when MENU DISPLAY HOME is TRACKS.",
    "short_label": "HOME ANALOG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "fm6_edit_1",
    "gesture": "shows",
    "action": "Shows OPS with its four control cards and the page graph or scope.",
    "short_label": "OPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "433-442",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L433-L442"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "fm6_edit_2",
    "gesture": "shows",
    "action": "Shows PATCH with its four control cards and the page graph or scope.",
    "short_label": "PATCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_fm6.c",
      "lines": "433-442",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_fm6.c#L433-L442"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "home_fm6",
    "gesture": "shows",
    "action": "Four parameter cards above a scope, or a four-track overview when MENU DISPLAY HOME is TRACKS.",
    "short_label": "HOME FM6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "phase_edit_1",
    "gesture": "shows",
    "action": "Shows PHS with its four control cards and the page graph or scope.",
    "short_label": "PHS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "189-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L189-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "phase_edit_2",
    "gesture": "shows",
    "action": "Shows LINE with its four control cards and the page graph or scope.",
    "short_label": "LINE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phase.c",
      "lines": "189-198",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phase.c#L189-L198"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "home_phase",
    "gesture": "shows",
    "action": "Four parameter cards above a scope, or a four-track overview when MENU DISPLAY HOME is TRACKS.",
    "short_label": "HOME PHASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "lofi_edit_1",
    "gesture": "shows",
    "action": "Shows CHIP with its four control cards and the page graph or scope.",
    "short_label": "CHIP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "225-234",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "lofi_edit_2",
    "gesture": "shows",
    "action": "Shows MOTN with its four control cards and the page graph or scope.",
    "short_label": "MOTN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "225-234",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L225-L234"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "home_lofi",
    "gesture": "shows",
    "action": "Four parameter cards above a scope, or a four-track overview when MENU DISPLAY HOME is TRACKS.",
    "short_label": "HOME LOFI",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "sample_edit_1",
    "gesture": "shows",
    "action": "Shows SET with its four control cards and the page graph or scope.",
    "short_label": "SET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "261-270",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L261-L270"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "sample_edit_2",
    "gesture": "shows",
    "action": "Shows TONE with its four control cards and the page graph or scope.",
    "short_label": "TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_sample.c",
      "lines": "261-270",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_sample.c#L261-L270"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "home_sample",
    "gesture": "shows",
    "action": "Four parameter cards above a scope, or a four-track overview when MENU DISPLAY HOME is TRACKS.",
    "short_label": "HOME SAMPLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "voice_edit_1",
    "gesture": "shows",
    "action": "Shows VOWL with its four control cards and the page graph or scope.",
    "short_label": "VOWL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "222-231",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L222-L231"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "voice_edit_2",
    "gesture": "shows",
    "action": "Shows TONE with its four control cards and the page graph or scope.",
    "short_label": "TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_formant.c",
      "lines": "222-231",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_formant.c#L222-L231"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "home_voice",
    "gesture": "shows",
    "action": "Four parameter cards above a scope, or a four-track overview when MENU DISPLAY HOME is TRACKS.",
    "short_label": "HOME VOICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "trio_edit_1",
    "gesture": "shows",
    "action": "Shows OSC with its four control cards and the page graph or scope.",
    "short_label": "OSC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "364-373",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L364-L373"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "trio_edit_2",
    "gesture": "shows",
    "action": "Shows TONE with its four control cards and the page graph or scope.",
    "short_label": "TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_trio.c",
      "lines": "364-373",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_trio.c#L364-L373"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "home_trio",
    "gesture": "shows",
    "action": "Four parameter cards above a scope, or a four-track overview when MENU DISPLAY HOME is TRACKS.",
    "short_label": "HOME TRIO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "wheel_edit_1",
    "gesture": "shows",
    "action": "Shows BARS with its four control cards and the page graph or scope.",
    "short_label": "BARS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "287-296",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L287-L296"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "wheel_edit_2",
    "gesture": "shows",
    "action": "Shows TONE with its four control cards and the page graph or scope.",
    "short_label": "TONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_wheel.c",
      "lines": "287-296",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_wheel.c#L287-L296"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "home_wheel",
    "gesture": "shows",
    "action": "Four parameter cards above a scope, or a four-track overview when MENU DISPLAY HOME is TRACKS.",
    "short_label": "HOME WHEEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "grain_edit_1",
    "gesture": "shows",
    "action": "Shows GRAN with its four control cards and the page graph or scope.",
    "short_label": "GRAN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "446-455",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L446-L455"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "grain_edit_2",
    "gesture": "shows",
    "action": "Shows SPRY with its four control cards and the page graph or scope.",
    "short_label": "SPRY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_grain.c",
      "lines": "446-455",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_grain.c#L446-L455"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "home_grain",
    "gesture": "shows",
    "action": "Four parameter cards above a scope, or a four-track overview when MENU DISPLAY HOME is TRACKS.",
    "short_label": "HOME GRAIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "phys_edit_1",
    "gesture": "shows",
    "action": "Shows BODY with its four control cards and the page graph or scope.",
    "short_label": "BODY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "240-249",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L240-L249"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "phys_edit_2",
    "gesture": "shows",
    "action": "Shows EXCT with its four control cards and the page graph or scope.",
    "short_label": "EXCT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "240-249",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L240-L249"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "home_phys",
    "gesture": "shows",
    "action": "Four parameter cards above a scope, or a four-track overview when MENU DISPLAY HOME is TRACKS.",
    "short_label": "HOME PHYS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "gurdy_edit_1",
    "gesture": "shows",
    "action": "Shows DRONE with its four control cards and the page graph or scope.",
    "short_label": "DRONE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "220-229",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L220-L229"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "gurdy_edit_2",
    "gesture": "shows",
    "action": "Shows WHEEL with its four control cards and the page graph or scope.",
    "short_label": "WHEEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "220-229",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L220-L229"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "home_gurdy",
    "gesture": "shows",
    "action": "Four parameter cards above a scope, or a four-track overview when MENU DISPLAY HOME is TRACKS.",
    "short_label": "HOME GURDY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "noise_edit_1",
    "gesture": "shows",
    "action": "Shows SRC with its four control cards and the page graph or scope.",
    "short_label": "SRC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "258-267",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L258-L267"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "noise_edit_2",
    "gesture": "shows",
    "action": "Shows MOVE with its four control cards and the page graph or scope.",
    "short_label": "MOVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "258-267",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L258-L267"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "home_noise",
    "gesture": "shows",
    "action": "Four parameter cards above a scope, or a four-track overview when MENU DISPLAY HOME is TRACKS.",
    "short_label": "HOME NOISE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "drum_edit_1",
    "gesture": "shows",
    "action": "Shows KIT with its four control cards and the page graph or scope.",
    "short_label": "KIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "333-342",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L333-L342"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "drum_edit_2",
    "gesture": "shows",
    "action": "Shows HIT with its four control cards and the page graph or scope.",
    "short_label": "HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_drum.c",
      "lines": "333-342",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_drum.c#L333-L342"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "home_drum",
    "gesture": "shows",
    "action": "Four parameter cards above a scope, or a four-track overview when MENU DISPLAY HOME is TRACKS.",
    "short_label": "HOME DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "slice_edit_1",
    "gesture": "shows",
    "action": "Shows SLCE with its four control cards and the page graph or scope.",
    "short_label": "SLCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "628-637",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L628-L637"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "slice_edit_2",
    "gesture": "shows",
    "action": "Shows PLAY with its four control cards and the page graph or scope.",
    "short_label": "PLAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_slice.c",
      "lines": "628-637",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_slice.c#L628-L637"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/params.c",
      "lines": "434-435",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L434-L435"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "home_slice",
    "gesture": "shows",
    "action": "Four parameter cards above a scope, or a four-track overview when MENU DISPLAY HOME is TRACKS.",
    "short_label": "HOME SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "1517-1523",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1517-L1523"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2315",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2315"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "881-895",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L881-L895"
     }
    ]
   },
   {
    "mode": "analog_edit_1_variant_1",
    "gesture": "shows",
    "action": "Shows the base page with SYNC when WAVE is SYNC.",
    "short_label": "ANALOG SYNC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "5-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L5-L25"
     }
    ]
   },
   {
    "mode": "analog_edit_1_variant_2",
    "gesture": "shows",
    "action": "Shows the base page with SUB when WAVE is SUB.",
    "short_label": "ANALOG SUB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_analog.c",
      "lines": "11-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_analog.c#L11-L25"
     }
    ]
   },
   {
    "mode": "lofi_edit_1_variant_3",
    "gesture": "shows",
    "action": "Shows the base page with WAV# when WAVE is WRAM.",
    "short_label": "LOFI WAV#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "6-7",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "20-21",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L20-L21"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "47-56",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L47-L56"
     }
    ]
   },
   {
    "mode": "home_lofi_variant_3",
    "gesture": "shows",
    "action": "Shows the base page with WAV# when WAVE is WRAM.",
    "short_label": "LOFI WAV#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "6-7",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L6-L7"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "20-21",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L20-L21"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "47-56",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L47-L56"
     }
    ]
   },
   {
    "mode": "lofi_edit_1_variant_4",
    "gesture": "shows",
    "action": "Shows the base page with DCY when CHIP is STEP.",
    "short_label": "LOFI DCY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "42-56",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L42-L56"
     }
    ]
   },
   {
    "mode": "home_lofi_variant_4",
    "gesture": "shows",
    "action": "Shows the base page with DCY when CHIP is STEP.",
    "short_label": "LOFI DCY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_lofi.c",
      "lines": "42-56",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_lofi.c#L42-L56"
     }
    ]
   },
   {
    "mode": "phys_edit_1_variant_5",
    "gesture": "shows",
    "action": "Shows the base page with HARM when MODEL is MEMB.",
    "short_label": "PHYS HARM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "18-21",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L18-L21"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "64-76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
     }
    ]
   },
   {
    "mode": "home_phys_variant_5",
    "gesture": "shows",
    "action": "Shows the base page with HARM when MODEL is MEMB.",
    "short_label": "PHYS HARM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "18-21",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L18-L21"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "64-76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
     }
    ]
   },
   {
    "mode": "phys_edit_2_variant_6",
    "gesture": "shows",
    "action": "Shows the base page with BEND when MODEL is MEMB.",
    "short_label": "PHYS BEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "18-21",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L18-L21"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "64-76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
     }
    ]
   },
   {
    "mode": "phys_edit_1_variant_7",
    "gesture": "shows",
    "action": "Shows the base page with CHRD when MODEL is SYMP.",
    "short_label": "PHYS CHRD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "22-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L22-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "62-76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L62-L76"
     }
    ]
   },
   {
    "mode": "home_phys_variant_7",
    "gesture": "shows",
    "action": "Shows the base page with CHRD when MODEL is SYMP.",
    "short_label": "PHYS CHRD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "22-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L22-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "62-76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L62-L76"
     }
    ]
   },
   {
    "mode": "phys_edit_2_variant_8",
    "gesture": "shows",
    "action": "Shows the base page with SYMP when MODEL is SYMP.",
    "short_label": "PHYS SYMP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "22-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L22-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "64-76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
     }
    ]
   },
   {
    "mode": "home_phys_variant_8",
    "gesture": "shows",
    "action": "Shows the base page with SYMP when MODEL is SYMP.",
    "short_label": "PHYS SYMP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "22-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L22-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "64-76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
     }
    ]
   },
   {
    "mode": "phys_edit_2_variant_9",
    "gesture": "shows",
    "action": "Shows the base page with BUZZ when MODEL is SYMP.",
    "short_label": "PHYS BUZZ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "22-25",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L22-L25"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_phys.c",
      "lines": "64-76",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_phys.c#L64-L76"
     }
    ]
   },
   {
    "mode": "noise_edit_2_variant_10",
    "gesture": "shows",
    "action": "Shows the base page with LEN when MODE is LFSR.",
    "short_label": "LFSR LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "8-9",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L8-L9"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "20-26",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L20-L26"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "45-52",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L45-L52"
     }
    ]
   },
   {
    "mode": "noise_edit_2_variant_11",
    "gesture": "shows",
    "action": "Shows the base page with LEN when MODE is META.",
    "short_label": "META LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "8-9",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L8-L9"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "20-26",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L20-L26"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "45-52",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L45-L52"
     }
    ]
   },
   {
    "mode": "noise_edit_2_variant_12",
    "gesture": "shows",
    "action": "Shows the base page with CLK when MODE is LFSR or META.",
    "short_label": "NOISE CLK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "8-14",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L8-L14"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "24-26",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L24-L26"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_noise.c",
      "lines": "45-52",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_noise.c#L45-L52"
     }
    ]
   },
   {
    "mode": "gurdy_edit_1_variant_13",
    "gesture": "shows",
    "action": "Shows the base page with GEAR when COUP is CRANK.",
    "short_label": "GURDY GEAR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "12-15",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L12-L15"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "210-215",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L210-L215"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "76-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L76-L83"
     }
    ]
   },
   {
    "mode": "home_gurdy_variant_13",
    "gesture": "shows",
    "action": "Shows the base page with GEAR when COUP is CRANK.",
    "short_label": "GURDY GEAR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "12-15",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L12-L15"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "210-215",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L210-L215"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/eng_gurdy.c",
      "lines": "76-83",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/eng_gurdy.c#L76-L83"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "shows",
    "action": "Shows the selected engine’s four main values, track and sound name, transport, tempo and battery, with a scope or four-track overview.",
    "short_label": "HOME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "316-380",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L316-L380"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "2185-2199",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L2185-L2199"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "shows",
    "action": "Shows the melodic sequence as a piano roll, its cursor and four step-edit values.",
    "short_label": "STEP ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "197-260",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L197-L260"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1038-1059",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1038-L1059"
     }
    ]
   },
   {
    "mode": "step_record",
    "gesture": "shows",
    "action": "Shows melodic STEP with recording armed and keys writing the cursor step.",
    "short_label": "STEP RECORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "541-569",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L541-L569"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "197-260",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L197-L260"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "shows",
    "action": "Shows drum lanes over sixteen steps, the selected lane and cursor, and the current bank.",
    "short_label": "STEP GRID",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "264-329",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L264-L329"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "610-620",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L610-L620"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "shows",
    "action": "Shows PLAY, QUANTIZE, motion and step-timing rows followed by + ADD.",
    "short_label": "AUTOMATION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_events.c",
      "lines": "140-157",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_events.c#L140-L157"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_graph.c",
      "lines": "1352-1426",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_graph.c#L1352-L1426"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "shows",
    "action": "Shows the selected tab, its rows and values, with the current row marked by a sword.",
    "short_label": "MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "455-473",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L455-L473"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "shows",
    "action": "Shows the name being typed, cursor, ABC or 123 mode and user category or project-name randomizer.",
    "short_label": "NAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "324-413",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L324-L413"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "shows",
    "action": "Shows the operation needing confirmation and OCT- or OCT+ answers.",
    "short_label": "DIALOG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1329-1360",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1329-L1360"
     }
    ]
   },
   {
    "mode": "about",
    "gesture": "shows",
    "action": "Shows GHOULBOX and Felucca version information, licence and credits.",
    "short_label": "ABOUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "110-120",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L110-L120"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "435-453",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L435-L453"
     }
    ]
   },
   {
    "mode": "info",
    "gesture": "shows",
    "action": "Shows underlying Felucca firmware information, USB connection and processor load.",
    "short_label": "INFO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_menu.c",
      "lines": "359-381",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L359-L381"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "shows",
    "action": "Names the next button to press or encoder to turn clockwise, with any piano key cancelling.",
    "short_label": "CALIBRATION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1736-1818",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1736-L1818"
     }
    ]
   },
   {
    "mode": "sleep",
    "gesture": "shows",
    "action": "The display is asleep while audio, MIDI and sequencing continue.",
    "short_label": "SLEEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "197-210",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L197-L210"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui.c",
      "lines": "282-290",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L282-L290"
     }
    ]
   },
   {
    "mode": "update",
    "gesture": "shows",
    "action": "Shows UPDATE MODE IN during the hold countdown and UBOOT after entering update mode.",
    "short_label": "UPDATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/main.c",
      "lines": "196-222",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/main.c#L196-L222"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_draw.c",
      "lines": "1390-1402",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1390-L1402"
     }
    ]
   },
   {
    "mode": "rescue",
    "gesture": "shows",
    "action": "Shows USB RESCUE, the USB installer prompt and AUDIO OFF, without normal pages.",
    "short_label": "RESCUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/rescue.c",
      "lines": "56-77",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/rescue.c#L56-L77"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "shows",
    "action": "Shows the quick layer’s key assignments, four knob values and available actions, with a lock mark when locked.",
    "short_label": "FX MAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "856-869",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L856-L869"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "1090-1214",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L1090-L1214"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "shows",
    "action": "Shows the quick layer’s key assignments, four knob values and available actions, with a lock mark when locked.",
    "short_label": "GLO MAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "856-869",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L856-L869"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "1090-1214",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L1090-L1214"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "shows",
    "action": "Shows the quick layer’s key assignments, four knob values and available actions, with a lock mark when locked.",
    "short_label": "SEL MAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "856-869",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L856-L869"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "1090-1214",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L1090-L1214"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "shows",
    "action": "Shows the quick layer’s key assignments, four knob values and available actions, with a lock mark when locked.",
    "short_label": "EDIT MAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "856-869",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L856-L869"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "1090-1214",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L1090-L1214"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "shows",
    "action": "Shows the quick layer’s key assignments, four knob values and available actions, with a lock mark when locked.",
    "short_label": "SEQ MAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "856-869",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L856-L869"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "1090-1214",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L1090-L1214"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "shows",
    "action": "Shows the quick layer’s key assignments, four knob values and available actions, with a lock mark when locked.",
    "short_label": "REC MAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "856-869",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L856-L869"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "1090-1214",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L1090-L1214"
     }
    ]
   },
   {
    "mode": "keys_layer",
    "gesture": "shows",
    "action": "Keeps the current page visible while optional NOTE NAMES reports notes or recognized chords in the header.",
    "short_label": "PLAY STATUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1233-1316",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1233-L1316"
     }
    ]
   },
   {
    "mode": "keys_split",
    "gesture": "shows",
    "action": "Keeps the current page visible while optional NOTE NAMES reports notes or recognized chords in the header.",
    "short_label": "PLAY STATUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1233-1316",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1233-L1316"
     }
    ]
   },
   {
    "mode": "scale_white",
    "gesture": "shows",
    "action": "Keeps the current page visible while optional NOTE NAMES reports notes or recognized chords in the header.",
    "short_label": "PLAY STATUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1233-1316",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1233-L1316"
     }
    ]
   },
   {
    "mode": "drum_play",
    "gesture": "shows",
    "action": "Keeps the current page visible while optional NOTE NAMES reports notes or recognized chords in the header.",
    "short_label": "PLAY STATUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1233-1316",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1233-L1316"
     }
    ]
   },
   {
    "mode": "drone_play",
    "gesture": "shows",
    "action": "Keeps the current page visible while optional NOTE NAMES reports notes or recognized chords in the header.",
    "short_label": "PLAY STATUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1233-1316",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1233-L1316"
     }
    ]
   },
   {
    "mode": "gurdy_crank",
    "gesture": "shows",
    "action": "Keeps the current page while SELECT drives the wheel, briefly identifying the crank if another track is selected.",
    "short_label": "CRANK STATUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1381-1401",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1381-L1401"
     }
    ]
   },
   {
    "mode": "momentary",
    "gesture": "shows",
    "action": "Keeps the current value page and reports temporary editing, pending KEEP, restoration or a full eight-value limit.",
    "short_label": "MOMENTARY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "87-100",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L87-L100"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "1429-1436",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1429-L1436"
     }
    ]
   }
  ]
 },
 "lights": {
  "button_home": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Marks the current page family, with HOME also representing MIXER, CLOCK and KEYS.",
    "short_label": "PAGE ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "38-41",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L38-L41"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "375-378",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L375-L378"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Inactive button lamps glow in DIM HI or DIM LO, go dark in OFF, and invert active and idle states in INV.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "342-360",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L342-L360"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "404-419",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L404-L419"
     }
    ],
    "light": "button"
   }
  ],
  "button_env": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Marks the current page family, with HOME also representing MIXER, CLOCK and KEYS.",
    "short_label": "PAGE ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "38-41",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L38-L41"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "375-378",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L375-L378"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Inactive button lamps glow in DIM HI or DIM LO, go dark in OFF, and invert active and idle states in INV.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "342-360",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L342-L360"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "404-419",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L404-L419"
     }
    ],
    "light": "button"
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Marks the current page family, with HOME also representing MIXER, CLOCK and KEYS.",
    "short_label": "PAGE ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "38-41",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L38-L41"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "375-378",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L375-L378"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Inactive button lamps glow in DIM HI or DIM LO, go dark in OFF, and invert active and idle states in INV.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "342-360",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L342-L360"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "404-419",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L404-L419"
     }
    ],
    "light": "button"
   }
  ],
  "button_fx": [
   {
    "mode": "layer_fx",
    "gesture": "breathing",
    "action": "Marks the quick layer whose map is open.",
    "short_label": "LAYER OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "381-382",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L381-L382"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Marks the active FX page family or, outside layers, a latched performance effect or nonzero macro.",
    "short_label": "FX ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "379-380",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L379-L380"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "375-380",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L375-L380"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Inactive button lamps glow in DIM HI or DIM LO, go dark in OFF, and invert active and idle states in INV.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "342-360",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L342-L360"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "404-419",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L404-L419"
     }
    ],
    "light": "button"
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Marks the current page family, with HOME also representing MIXER, CLOCK and KEYS.",
    "short_label": "PAGE ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "38-41",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L38-L41"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "375-378",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L375-L378"
     }
    ],
    "light": "button"
   },
   {
    "mode": "layer_scl",
    "gesture": "breathing",
    "action": "Marks the quick layer whose map is open.",
    "short_label": "LAYER OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "381-382",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L381-L382"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Inactive button lamps glow in DIM HI or DIM LO, go dark in OFF, and invert active and idle states in INV.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "342-360",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L342-L360"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "404-419",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L404-L419"
     }
    ],
    "light": "button"
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Marks the current page family, with HOME also representing MIXER, CLOCK and KEYS.",
    "short_label": "PAGE ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "38-41",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L38-L41"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "375-378",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L375-L378"
     }
    ],
    "light": "button"
   },
   {
    "mode": "layer_edit",
    "gesture": "breathing",
    "action": "Marks the quick layer whose map is open.",
    "short_label": "LAYER OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "381-382",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L381-L382"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Inactive button lamps glow in DIM HI or DIM LO, go dark in OFF, and invert active and idle states in INV.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "342-360",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L342-L360"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "404-419",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L404-L419"
     }
    ],
    "light": "button"
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Marks the current page family, with HOME also representing MIXER, CLOCK and KEYS.",
    "short_label": "PAGE ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "38-41",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L38-L41"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "375-378",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L375-L378"
     }
    ],
    "light": "button"
   },
   {
    "mode": "layer_glo",
    "gesture": "breathing",
    "action": "Marks the quick layer whose map is open.",
    "short_label": "LAYER OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "381-382",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L381-L382"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Inactive button lamps glow in DIM HI or DIM LO, go dark in OFF, and invert active and idle states in INV.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "342-360",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L342-L360"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "404-419",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L404-L419"
     }
    ],
    "light": "button"
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Marks the current page family, with HOME also representing MIXER, CLOCK and KEYS.",
    "short_label": "PAGE ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "38-41",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L38-L41"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "375-378",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L375-L378"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Inactive button lamps glow in DIM HI or DIM LO, go dark in OFF, and invert active and idle states in INV.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "342-360",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L342-L360"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "404-419",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L404-L419"
     }
    ],
    "light": "button"
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Marks the current page family, with HOME also representing MIXER, CLOCK and KEYS.",
    "short_label": "PAGE ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "38-41",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L38-L41"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "375-378",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L375-L378"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "flash",
    "action": "Pulses to the beat while any track’s arp has held notes, with the first beat longer and dark pulses on an ARP page.",
    "short_label": "ARP BEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "175-182",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L175-L182"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "377-378",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L377-L378"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Inactive button lamps glow in DIM HI or DIM LO, go dark in OFF, and invert active and idle states in INV.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "342-360",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L342-L360"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "404-419",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L404-L419"
     }
    ],
    "light": "button"
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Marks the current page family, with HOME also representing MIXER, CLOCK and KEYS.",
    "short_label": "PAGE ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "38-41",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L38-L41"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "375-378",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L375-L378"
     }
    ],
    "light": "button"
   },
   {
    "mode": "layer_seq",
    "gesture": "breathing",
    "action": "Marks the quick layer whose map is open.",
    "short_label": "LAYER OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "381-382",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L381-L382"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Inactive button lamps glow in DIM HI or DIM LO, go dark in OFF, and invert active and idle states in INV.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "342-360",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L342-L360"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "404-419",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L404-L419"
     }
    ],
    "light": "button"
   }
  ],
  "button_rec": [
   {
    "mode": "layer_rec",
    "gesture": "breathing",
    "action": "Marks the quick layer whose map is open.",
    "short_label": "LAYER OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "381-382",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L381-L382"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Shows that at least one track is armed for recording outside the REC layer.",
    "short_label": "ARMED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "383",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L383"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Inactive button lamps glow in DIM HI or DIM LO, go dark in OFF, and invert active and idle states in INV.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "342-360",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L342-L360"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "404-419",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L404-L419"
     }
    ],
    "light": "button"
   }
  ],
  "button_play_stop": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "The green lamp stays on during playback.",
    "short_label": "PLAYING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "406-422",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L406-L422"
     }
    ],
    "light": "green"
   },
   {
    "mode": "any",
    "gesture": "flash",
    "action": "The green lamp flashes for each beat during a count-in.",
    "short_label": "COUNT-IN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "421-422",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L421-L422"
     }
    ],
    "light": "green"
   },
   {
    "mode": "any",
    "gesture": "off",
    "action": "The ordinary PLAY lamp is dark during playback and count-in.",
    "short_label": "PLAY AMBER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "406-411",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L406-L411"
     }
    ],
    "light": "amber"
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Inactive button lamps glow in DIM HI or DIM LO, go dark in OFF, and invert active and idle states in INV.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "342-360",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L342-L360"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "404-419",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L404-L419"
     }
    ],
    "light": "button"
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Shows a negative octave shift.",
    "short_label": "OCTAVE STATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "104-119",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L104-L119"
     }
    ],
    "light": "button"
   },
   {
    "mode": "menu",
    "gesture": "breathing",
    "action": "Shows that the selected setting can move in this direction, with OCT+ also marking an opening action.",
    "short_label": "VALUE OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "110-114",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L110-L114"
     }
    ],
    "light": "button"
   },
   {
    "mode": "dialog",
    "gesture": "lit",
    "action": "Marks the cancel or back action in a dialog, naming or action page.",
    "short_label": "BACK READY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "106-116",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L106-L116"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Inactive button lamps glow in DIM HI or DIM LO, go dark in OFF, and invert active and idle states in INV.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "342-360",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L342-L360"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "404-419",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L404-L419"
     }
    ],
    "light": "button"
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Shows a positive octave shift.",
    "short_label": "OCTAVE STATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "104-119",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L104-L119"
     }
    ],
    "light": "button"
   },
   {
    "mode": "menu",
    "gesture": "breathing",
    "action": "Shows that the selected setting can move in this direction, with OCT+ also marking an opening action.",
    "short_label": "VALUE OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "110-114",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L110-L114"
     }
    ],
    "light": "button"
   },
   {
    "mode": "dialog",
    "gesture": "breathing",
    "action": "Marks the affirmative action in a dialog or ready action page.",
    "short_label": "ACCEPT READY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "115-116",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L115-L116"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "breathing",
    "action": "With temporary LFO-held edits pending, shows that OCT+ will keep them.",
    "short_label": "KEEP READY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "117-118",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L117-L118"
     }
    ],
    "light": "button"
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "Inactive button lamps glow in DIM HI or DIM LO, go dark in OFF, and invert active and idle states in INV.",
    "short_label": "IDLE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "342-360",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L342-L360"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "404-419",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L404-L419"
     }
    ],
    "light": "button"
   }
  ],
  "key_lights": [
   {
    "mode": "any",
    "gesture": "lit",
    "action": "Tracks held keys, plus notes that the current keyboard can represent from MIDI, the arp and the selected sequence.",
    "short_label": "NOTES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "189-229",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L189-L229"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "328-339",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L328-L339"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "action": "With SCALE LEDS enabled outside key maps, scale notes glow and roots are brighter, with a corresponding reversed picture in INV.",
    "short_label": "SCALE GLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "269-297",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L269-L297"
     },
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "342-359",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L342-L359"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "lit",
    "action": "While stopped, shows notes stored in the cursor step instead of a resting step.",
    "short_label": "CURSOR NOTES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "232-255",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L232-L255"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "lit",
    "action": "Shows the selected lane’s hits, or accents with ACC held, with the playing step inverted and the selected lane lit.",
    "short_label": "HITS / HEAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "122-141",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L122-L141"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "dim",
    "action": "Usable step keys glow, with steps 1, 5, 9 and 13 brighter when empty and outside the playhead.",
    "short_label": "BEAT MARKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "144-171",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L144-L171"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "blinking",
    "action": "The active white letter-group key blinks while characters are being cycled, and usable keys are lit.",
    "short_label": "LETTER GROUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_name.c",
      "lines": "314-322",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L314-L322"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "lit",
    "action": "Shows every key mapped to the selected slice.",
    "short_label": "SLICE KEYS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_slice.c",
      "lines": "212-221",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_slice.c#L212-L221"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "lit",
    "action": "Shows the A3, B3, C4 or D4 key matching the selected cell’s pattern, with none for a silent or + ADD cell.",
    "short_label": "PATTERN KEY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "529-538",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L529-L538"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "breathing",
    "action": "With ANIM IDLE on, a quiet stopped panel begins a key sweep and breathing button animation after 60 seconds without panel activity.",
    "short_label": "IDLE ANIM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_input.c",
      "lines": "300-323",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L300-L323"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "lit",
    "action": "Marks active map choices: held or latched available effects.",
    "short_label": "MAP STATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "815-853",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L815-L853"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "breathing",
    "action": "Marks available inactive map actions; unavailable keys remain dark.",
    "short_label": "MAP OPTIONS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "815-853",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L815-L853"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "lit",
    "action": "Marks active map choices: audible tracks, held solos and enabled drone latches.",
    "short_label": "MAP STATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "815-853",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L815-L853"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "breathing",
    "action": "Marks available inactive map actions; unavailable keys remain dark.",
    "short_label": "MAP OPTIONS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "815-853",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L815-L853"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "lit",
    "action": "Marks active map choices: the root note.",
    "short_label": "MAP STATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "815-853",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L815-L853"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "breathing",
    "action": "Marks available inactive map actions; unavailable keys remain dark.",
    "short_label": "MAP OPTIONS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "815-853",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L815-L853"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "lit",
    "action": "Marks active map choices: the current engine and unmuted drum lanes.",
    "short_label": "MAP STATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "815-853",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L815-L853"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "breathing",
    "action": "Marks available inactive map actions; unavailable keys remain dark.",
    "short_label": "MAP OPTIONS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "815-853",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L815-L853"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "lit",
    "action": "Marks active map choices: the selected drum lane.",
    "short_label": "MAP STATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "815-853",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L815-L853"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "breathing",
    "action": "Marks available inactive map actions; unavailable keys remain dark.",
    "short_label": "MAP OPTIONS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "815-853",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L815-L853"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "lit",
    "action": "Marks active map choices: enabled recording settings.",
    "short_label": "MAP STATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "815-853",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L815-L853"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "breathing",
    "action": "Marks available inactive map actions; unavailable keys remain dark.",
    "short_label": "MAP OPTIONS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
      "ref": "ghoulbox-v2.1",
      "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
      "path": "firmware/src/ui_layer.c",
      "lines": "815-853",
      "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L815-L853"
     }
    ]
   }
  ]
 },
 "groups": {
  "key_lights": [
   "led_f3",
   "led_fs3",
   "led_g3",
   "led_gs3",
   "led_a3",
   "led_as3",
   "led_b3",
   "led_c4",
   "led_cs4",
   "led_d4",
   "led_ds4",
   "led_e4",
   "led_f4",
   "led_fs4",
   "led_g4",
   "led_gs4",
   "led_a4",
   "led_as4",
   "led_b4",
   "led_c5",
   "led_cs5",
   "led_d5",
   "led_ds5",
   "led_e5",
   "led_f5",
   "led_fs5",
   "led_g5"
  ]
 },
 "switching_note": {
  "kept_on_unit": "Four named projects, 32 user sounds, their FM6 patches, three sample slots, settings and an optional last-session autosave live in flash; a separate 32-voice FM6 bank uses its own record. RESTORE LAST defaults to ON in a fresh 2.1 setup; its one-time import migration can be affected by preference bytes inherited from Felucca. See the flash atlas for cross-firmware consequences. From the flash atlas (generated): install (bundled update loader): Writes differing program sectors only, with verification; leaves the flash head untouched (successful install/update). install (update-record cleanup): Erases scanned sectors whose tails contain valid update records, while protecting 0x97000–0xDFFFF. When present, this clears the family record at 0xE4000 and the stock record at 0xE8000 (when the final part of a scanned sector passes the update-record checks). first and subsequent boot: Erases all five update-staging sectors when the first four bytes or the record at 0xE4F00 are not erased. No settings, project or autosave write solely because of boot (staging area appears used). boot: old FM6 patch migration: Converts a compatible older FM6 patch bank when its replacement is missing, writing one new copy and avoiding the newest old copy. Other data is not converted (when a readable retired FM6 patch bank remains and no valid replacement exists). boot: staged voice-bank recovery: Restores a compatible unfinished voice-bank upload, including one left by Felucca. The home sector can contain another firmware’s data (only when the saved bank is missing or older than the pending upload). update launched from GHOULBOX: Stages and verifies an incoming update loader and commits its restart record before resetting. Entering the separate chip-update screen follows a different path (when an installer starts an upgrade). What GHOULBOX writes over the previous firmware's data is in overwrites_previous; what the next firmware writes over GHOULBOX's is in when_you_leave.",
  "lost": "Undo, live performance mutes, drone-latch state and sounding notes are not a durable backup. New projects use FUNA with parameter count 112; a loader whose parameter limit is below 112 rejects them. The older GHOULBOX release loaders were not read for this map, so compatibility with a particular earlier version is unverified. Keep the earlier backup and use that version’s editor when going back; see the flash atlas for switching to another firmware. From the flash atlas (generated): Other firmwares reading GHOULBOX's data: ChoralRoot takes over GHOULBOX's settings and panel calibration, converting them (on entering ChoralRoot, panel calibration and HOLD can carry over; ChoralRoot’s own options start at defaults and LOWCUT/BASS+ becomes Off); ChoralRoot lists GHOULBOX's user sounds 1–16; user sounds 17–32, but plays them differently (legacy records may be copied, but retired/renumbered engines and foreign deep patches change their sound; confirmed Flash Data still erases the sources); Felucca reads and uses GHOULBOX's settings and panel calibration; user sounds 1–16; user sounds 17–32; FM6 patches for user sounds; FM6 voice bank B1–B32; user sample slot USR1; user sample slot USR2; user sample slot USR3 (different shared preference meanings; a settings round trip can turn GHOULBOX RESTORE LAST OFF; CLICK REC can add CUSTOM under COLOR without selecting it, and scene/screen settings are reused; GURDY records show unused; shared bank writes retain their bytes until overwritten); SLOOP reads and uses GHOULBOX's user sample slot USR1; user sample slot USR2; user sample slot USR3; X0X reads and uses GHOULBOX's user sample slot USR1; user sample slot USR2; user sample slot USR3; JIANT reads and uses GHOULBOX's settings and panel calibration; FM6 patches for user sounds (shared bytes change USB, palette, chord-entry, HOME and screen preferences; RESTORE LAST has the opposite meaning and a round trip can turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW become MIDI OUT or are cleared, KNOB ACCEL is inverted, SCENE becomes SCREEN OFF and first-start revision update turns FX LATCH OFF); JIANT lists GHOULBOX's user sounds 1–16; user sounds 17–32, but plays them differently (whole-bank conversion changes FM6 fingerprints and can detach GHOULBOX patches; GURDY slots look empty in JIANT and a save replaces them without asking); Hortator reads and uses GHOULBOX's user sample slot USR1; user sample slot USR2; user sample slot USR3 (Sample bytes remain on the unit; playback follows Hortator’s one-shot engines, so loop and slice behaviour can differ. Valid header and zone bounds are required; no unit switch was tested); Skiff lists GHOULBOX's user sounds 1–16; user sounds 17–32, but plays them differently (GURDY records become DRUM-X; a matching name does not prove the same sound); Skiff reads and uses GHOULBOX's FM6 patches for user sounds; user sample slot USR1; user sample slot USR2; user sample slot USR3 (an FM6 patch must still match its user record; sample playback and loop behaviour follow the reader’s engines); Skiff imports part of GHOULBOX’s settings and calibration, but can clear GURDY stars, click preferences and other settings and save without asking. What GHOULBOX reads of other firmwares' data: GHOULBOX reads and uses Felucca's settings, button calibration, favourites, MIDI LEARN map; project slot A; project slot B; project slot C; project slot D; user presets 1-16; user presets 17-32; FM6 patches of the FM6 user presets; autosave (the music as you left it); FM6 voice bank B1-B32; user sample slot USR1; user sample slot USR2; user sample slot USR3 (shared settings have different preference meanings; saving or autosaving converts to np112, unreadable by current Felucca; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ); GHOULBOX reads and uses JIANT's settings, calibration, favourites, MENU options; FM6 patches of the FM6 user sounds (shared settings have different preference meanings); GHOULBOX lists SLOOP's user sounds U01-U16; user sounds U17-U32, but plays them differently (all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ); GHOULBOX lists JIANT's user sounds U01-U16; user sounds U17-U32, but plays them differently (all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ); GHOULBOX reads and uses SLOOP's user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000); user sample slot USR3 (header at 0xC8000); GHOULBOX reads and uses X0X's break loops slot 1; break loops slot 2; break loops slot 3; GHOULBOX takes over Hortator's settings and panel calibration, converting them (settings convert when read; next save writes a newer format the previous firmware cannot import); GHOULBOX reads and uses Hortator's user samples USR1; user samples USR2; user samples USR3 (sample loop and slice behaviour follow this reader’s engines); GHOULBOX reads and uses Skiff's settings, calibration and favourites; user sounds’ own FM6 patches; user sample USR1; user sample USR2; user sample USR3 (shared settings bytes select different preferences; each patch must still match its FM6 user record; sample loop and slice behaviour follow this reader’s engines); GHOULBOX lists Skiff's user sound bank 1; user sound bank 2, but plays them differently (DRUM-X sounds are empty or a different engine; shared names do not guarantee shared sound). Everything else of another firmware's looks empty or foreign to the reader.",
  "back_up_first": "In the GHOULBOX editor, connect the unit and use Settings > Save backup before installing. It exports current music, four stored projects, settings, two user-sound banks, their FM6 patches and USR1–3 audio. It omits the separate 32-voice FM6 bank and manual-slice tail records beyond sample audio, so retain the original voice-bank SysEx and record custom slice boundaries separately. The installer makes no backup.",
  "writes_when": "Settings use 0xFC000/0xFD000 when the menu closes, a first quick-layer flag is stored, a favourite/list changes, REC/FX-map options are kept, calibration completes or the editor requests a write. Four project pairs occupy 0x97000–0x9EFFF and write deliberately. User banks use 0xDC000–0xDFFFF, their FM6 patch pair 0x9F000/0xFE000, sample slots 0xA0000–0xDBFFF, and the voice bank 0xE7000 with staging at 0xE5000/0xE6000. RESTORE LAST autosaves to that staging pair only after a session change and quiet stopped operation, subject to the startup guard. Install writes program sectors and update records; ordinary boot cleans update staging and may recover or migrate compatible FM6 records. See the flash atlas for each write trigger and cross-firmware consequences.",
  "source": [
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/storage.c",
    "lines": "64-75",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/storage.c#L64-L75"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/project.c",
    "lines": "1118-1151",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/project.c#L1118-L1151"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/project.c",
    "lines": "1206-1237",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/project.c#L1206-L1237"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/project.c",
    "lines": "1239-1257",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/project.c#L1239-L1257"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/project.c",
    "lines": "1299-1366",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/project.c#L1299-L1366"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/settings_persist.c",
    "lines": "64-75",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/settings_persist.c#L64-L75"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/project.c",
    "lines": "605-654",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/project.c#L605-L654"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/editor_backup.c",
    "lines": "11-59",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/editor_backup.c#L11-L59"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/slice_store.c",
    "lines": "21-36",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/slice_store.c#L21-L36"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/fm6_vbank.c",
    "lines": "111-134",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/fm6_vbank.c#L111-L134"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/up_fm6.c",
    "lines": "142-195",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/up_fm6.c#L142-L195"
   },
   {
    "kind": "doc",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "README.md",
    "lines": "147-160",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/README.md#L147-L160"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_name.c",
    "lines": "91-100",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L91-L100"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_name.c",
    "lines": "221-241",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L221-L241"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_name.c",
    "lines": "244-265",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L244-L265"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/upreset.c",
    "lines": "102-105",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L102-L105"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/upreset.c",
    "lines": "307-343",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L307-L343"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/upreset.c",
    "lines": "438-448",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L438-L448"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/upreset.c",
    "lines": "570-590",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L570-L590"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/up_fm6.c",
    "lines": "76-83",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/up_fm6.c#L76-L83"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/up_fm6.c",
    "lines": "117-124",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/up_fm6.c#L117-L124"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/up_fm6.c",
    "lines": "201-213",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/up_fm6.c#L201-L213"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/storage.c",
    "lines": "17",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/storage.c#L17"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/storage.c",
    "lines": "79-120",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/storage.c#L79-L120"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/storage.c",
    "lines": "136-150",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/storage.c#L136-L150"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/up_fm6.c",
    "lines": "144-153",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/up_fm6.c#L144-L153"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/upreset.c",
    "lines": "72-105",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L72-L105"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/upreset.c",
    "lines": "394",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L394"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/upreset.c",
    "lines": "590",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L590"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/category.c",
    "lines": "7-14",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/category.c#L7-L14"
   }
  ],
  "fm6_category_warning": "An FM6 rename or category change can detach its saved patch, even with OTHER left unchanged; a later load may use a factory or initial voice.",
  "melodee_storage_warning": "The storage comparison uses Melodee’s current UPB2/CMP2 layout: GHOULBOX does not decode it, and its first write can erase a newest Melodee copy because it checks payload at +256 rather than +32; project D also overlaps Melodee U379–U384 at 0x9D000/0x9E000.",
  "table_status": "Before switching: back up first; see the switching advice in this section.",
  "overwrites_previous": [
   {
    "from": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "stock settings (and possibly patterns)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): stock settings (and possibly patterns).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "baudgirl",
    "name": "Baud Girl FM-1+VA",
    "flags": "?",
    "weakest_grade": "inferred",
    "at_risk": [],
    "possibly_at_risk": [
     "Baud Girl presets (128)",
     "Baud Girl patterns (16, with locks)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): Baud Girl presets (128); Baud Girl patterns (16, with locks).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "felucca",
    "name": "Felucca",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the autosave (the music as you left it)",
      "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, button calibration, favourites, MIDI LEARN map",
      "effect": "changed by itself: Import changes reserved preference bytes and may change SERIAL/RESTORE LAST in RAM; next ordinary settings write persists them; also, shared settings have different preference meanings",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "changed by itself: Import changes reserved preference bytes and may change SERIAL/RESTORE LAST in RAM; next ordinary settings write persists them; also, shared settings have different preference meanings"
       },
       {
        "way": "when you erase a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "changed by itself: Import changes reserved preference bytes and may change SERIAL/RESTORE LAST in RAM; next ordinary settings write persists them; also, shared settings have different preference meanings"
       },
       {
        "way": "when you restore a backup",
        "effect": "changed by itself: Import changes reserved preference bytes and may change SERIAL/RESTORE LAST in RAM; next ordinary settings write persists them; also, shared settings have different preference meanings"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "changed by itself: Import changes reserved preference bytes and may change SERIAL/RESTORE LAST in RAM; next ordinary settings write persists them; also, shared settings have different preference meanings"
       },
       {
        "way": "when you send settings from the editor",
        "effect": "changed by itself: Import changes reserved preference bytes and may change SERIAL/RESTORE LAST in RAM; next ordinary settings write persists them; also, shared settings have different preference meanings"
       }
      ]
     },
     {
      "object": "project slot A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (it asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user presets 1-16",
      "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ",
      "ways": [
       {
        "way": "when you erase a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you rename a user preset (no question; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you restore a backup",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you save a user preset (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       }
      ]
     },
     {
      "object": "user presets 17-32",
      "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ",
      "ways": [
       {
        "way": "when you erase a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you rename a user preset (no question; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you restore a backup",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you save a user preset (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "FM6 patches of the FM6 user presets",
     "user sample slot USR1",
     "user sample slot USR2",
     "user sample slot USR3",
     "FM6 voice bank B1-B32"
    ],
    "kept_unseen": [],
    "notes": [
     "After Felucca with its default CLICK LEVEL, GHOULBOX turns RESTORE LAST ON during import and autosaves by itself after edits and quiet, regardless of the earlier RESTORE LAST choice. A saved LOW click level is the exception: other saved preferences can leave autosave OFF. Check RESTORE LAST after importing LOW-click-level settings."
    ],
    "owner_text": "At risk by itself: the autosave (the music as you left it); settings, button calibration, favourites, MIDI LEARN map (changed by itself: Import changes reserved preference bytes and may change SERIAL/RESTORE LAST in RAM; next ordinary settings write persists them; also, shared settings have different preference meanings). At risk when you act: project slot A; project slot B; project slot C; project slot D; user presets 1-16 (converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ); user presets 17-32 (converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ). Carried over: FM6 patches of the FM6 user presets; user sample slot USR1; user sample slot USR2; user sample slot USR3; FM6 voice bank B1-B32. After Felucca with its default CLICK LEVEL, GHOULBOX turns RESTORE LAST ON during import and autosaves by itself after edits and quiet, regardless of the earlier RESTORE LAST choice. A saved LOW click level is the exception: other saved preferences can leave autosave OFF. Check RESTORE LAST after importing LOW-click-level settings.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloop",
    "name": "SLOOP",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 patch bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "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, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you 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": "the music in progress (autosave)",
      "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": "user sample slot USR4 (header at 0xE7000)",
      "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": "song section A (a whole project)",
      "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": "song section B (a whole project)",
      "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": "song section C (a whole project)",
      "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": "song section D (a whole project)",
      "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": "user sounds U01-U16",
      "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ",
      "ways": [
       {
        "way": "when you erase a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you rename a user preset (no question; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you restore a backup",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you save a user preset (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ",
      "ways": [
       {
        "way": "when you erase a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you rename a user preset (no question; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you restore a backup",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you save a user preset (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sample slot USR1 (header at 0xA0000)",
     "user sample slot USR2 (header at 0xB4000)",
     "user sample slot USR3 (header at 0xC8000)"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FM6 patch bank B1-B27; settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk by itself, under a condition: the music in progress (autosave); user sample slot USR4 (header at 0xE7000). At risk when you act: song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project); user sounds U01-U16 (converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ); user sounds U17-U32 (converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ). Carried over: user sample slot USR1 (header at 0xA0000); user sample slot USR2 (header at 0xB4000); user sample slot USR3 (header at 0xC8000).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "x0x",
    "name": "X0X",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the whole X0X project (settings, sound, all 32 patterns, song, knob motion)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send settings from the editor",
        "effect": "lost"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "X0X button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "break loops slot 1",
     "break loops slot 2",
     "break loops slot 3"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: the whole X0X project (settings, sound, all 32 patterns, song, knob motion). At risk when you act: X0X button calibration. Carried over: break loops slot 1; break loops slot 2; break loops slot 3.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "jiant",
    "name": "JIANT",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the music in progress (RESTORE LAST)",
      "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, calibration, favourites, MENU options",
      "effect": "changed by itself: Import changes reserved preference bytes and may change SERIAL/RESTORE LAST in RAM; next ordinary settings write persists them. KNOB ACCEL is inverted: JIANT’s default ON reads as OFF in GHOULBOX. JIANT’s MIDI OUT CLOCK / ALL / OFF in byte [15][24] read as GHOULBOX SCOPE MIX / STEP PREVIEW / both. JIANT’s LOAD LITE in [15][26] reads as HOME TRACKS, and LOAD ECO reads as HOME SCOPE. JIANT’s USB STEMS [15][21], USB LEVEL [15][22] and palette marker 0x4A [15][23] overlap GHOULBOX’s FX key map [15][14..23], changing some FX key assignments. JIANT’s first start stores settings revision 2 in byte [15][25], so after JIANT, GHOULBOX’s screen sleeps after 5 minutes idle by default; also, shared settings have different preference meanings",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "changed by itself: Import changes reserved preference bytes and may change SERIAL/RESTORE LAST in RAM; next ordinary settings write persists them. KNOB ACCEL is inverted: JIANT’s default ON reads as OFF in GHOULBOX. JIANT’s MIDI OUT CLOCK / ALL / OFF in byte [15][24] read as GHOULBOX SCOPE MIX / STEP PREVIEW / both. JIANT’s LOAD LITE in [15][26] reads as HOME TRACKS, and LOAD ECO reads as HOME SCOPE. JIANT’s USB STEMS [15][21], USB LEVEL [15][22] and palette marker 0x4A [15][23] overlap GHOULBOX’s FX key map [15][14..23], changing some FX key assignments. JIANT’s first start stores settings revision 2 in byte [15][25], so after JIANT, GHOULBOX’s screen sleeps after 5 minutes idle by default; also, shared settings have different preference meanings"
       },
       {
        "way": "when you erase a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "changed by itself: Import changes reserved preference bytes and may change SERIAL/RESTORE LAST in RAM; next ordinary settings write persists them. KNOB ACCEL is inverted: JIANT’s default ON reads as OFF in GHOULBOX. JIANT’s MIDI OUT CLOCK / ALL / OFF in byte [15][24] read as GHOULBOX SCOPE MIX / STEP PREVIEW / both. JIANT’s LOAD LITE in [15][26] reads as HOME TRACKS, and LOAD ECO reads as HOME SCOPE. JIANT’s USB STEMS [15][21], USB LEVEL [15][22] and palette marker 0x4A [15][23] overlap GHOULBOX’s FX key map [15][14..23], changing some FX key assignments. JIANT’s first start stores settings revision 2 in byte [15][25], so after JIANT, GHOULBOX’s screen sleeps after 5 minutes idle by default; also, shared settings have different preference meanings"
       },
       {
        "way": "when you restore a backup",
        "effect": "changed by itself: Import changes reserved preference bytes and may change SERIAL/RESTORE LAST in RAM; next ordinary settings write persists them. KNOB ACCEL is inverted: JIANT’s default ON reads as OFF in GHOULBOX. JIANT’s MIDI OUT CLOCK / ALL / OFF in byte [15][24] read as GHOULBOX SCOPE MIX / STEP PREVIEW / both. JIANT’s LOAD LITE in [15][26] reads as HOME TRACKS, and LOAD ECO reads as HOME SCOPE. JIANT’s USB STEMS [15][21], USB LEVEL [15][22] and palette marker 0x4A [15][23] overlap GHOULBOX’s FX key map [15][14..23], changing some FX key assignments. JIANT’s first start stores settings revision 2 in byte [15][25], so after JIANT, GHOULBOX’s screen sleeps after 5 minutes idle by default; also, shared settings have different preference meanings"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "changed by itself: Import changes reserved preference bytes and may change SERIAL/RESTORE LAST in RAM; next ordinary settings write persists them. KNOB ACCEL is inverted: JIANT’s default ON reads as OFF in GHOULBOX. JIANT’s MIDI OUT CLOCK / ALL / OFF in byte [15][24] read as GHOULBOX SCOPE MIX / STEP PREVIEW / both. JIANT’s LOAD LITE in [15][26] reads as HOME TRACKS, and LOAD ECO reads as HOME SCOPE. JIANT’s USB STEMS [15][21], USB LEVEL [15][22] and palette marker 0x4A [15][23] overlap GHOULBOX’s FX key map [15][14..23], changing some FX key assignments. JIANT’s first start stores settings revision 2 in byte [15][25], so after JIANT, GHOULBOX’s screen sleeps after 5 minutes idle by default; also, shared settings have different preference meanings"
       },
       {
        "way": "when you send settings from the editor",
        "effect": "changed by itself: Import changes reserved preference bytes and may change SERIAL/RESTORE LAST in RAM; next ordinary settings write persists them. KNOB ACCEL is inverted: JIANT’s default ON reads as OFF in GHOULBOX. JIANT’s MIDI OUT CLOCK / ALL / OFF in byte [15][24] read as GHOULBOX SCOPE MIX / STEP PREVIEW / both. JIANT’s LOAD LITE in [15][26] reads as HOME TRACKS, and LOAD ECO reads as HOME SCOPE. JIANT’s USB STEMS [15][21], USB LEVEL [15][22] and palette marker 0x4A [15][23] overlap GHOULBOX’s FX key map [15][14..23], changing some FX key assignments. JIANT’s first start stores settings revision 2 in byte [15][25], so after JIANT, GHOULBOX’s screen sleeps after 5 minutes idle by default; also, shared settings have different preference meanings"
       }
      ]
     },
     {
      "object": "FM6 voice bank B1-B32",
      "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": "song 1 section A (a whole project)",
      "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": "song 1 section B (a whole project)",
      "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": "song 1 section C (a whole project)",
      "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": "song 1 section D (a whole project)",
      "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": "song 2: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 3: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 4: four sections (whole projects)",
      "effect": "some of it lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "some of it lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "some of it lost"
       }
      ]
     },
     {
      "object": "song 5: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 6: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 7: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 8: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "which song is current, every song's rows and scenes",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ",
      "ways": [
       {
        "way": "when you erase a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you rename a user preset (no question; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you restore a backup",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you save a user preset (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ",
      "ways": [
       {
        "way": "when you erase a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you rename a user preset (no question; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you restore a backup",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you save a user preset (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "FM6 patches of the FM6 user sounds"
    ],
    "kept_unseen": [],
    "notes": [
     "After JIANT with its default CLICK LEVEL, GHOULBOX turns RESTORE LAST ON during import and autosaves by itself after edits and quiet, regardless of the earlier RESTORE LAST choice. A saved LOW click level is the exception: other saved preferences can leave autosave OFF. Check RESTORE LAST after importing LOW-click-level settings."
    ],
    "owner_text": "At risk by itself: the music in progress (RESTORE LAST); settings, calibration, favourites, MENU options (changed by itself: Import changes reserved preference bytes and may change SERIAL/RESTORE LAST in RAM; next ordinary settings write persists them. KNOB ACCEL is inverted: JIANT’s default ON reads as OFF in GHOULBOX. JIANT’s MIDI OUT CLOCK / ALL / OFF in byte [15][24] read as GHOULBOX SCOPE MIX / STEP PREVIEW / both. JIANT’s LOAD LITE in [15][26] reads as HOME TRACKS, and LOAD ECO reads as HOME SCOPE. JIANT’s USB STEMS [15][21], USB LEVEL [15][22] and palette marker 0x4A [15][23] overlap GHOULBOX’s FX key map [15][14..23], changing some FX key assignments. JIANT’s first start stores settings revision 2 in byte [15][25], so after JIANT, GHOULBOX’s screen sleeps after 5 minutes idle by default; also, shared settings have different preference meanings). At risk by itself, under a condition: FM6 voice bank B1-B32. At risk when you act: song 1 section A (a whole project); song 1 section B (a whole project); song 1 section C (a whole project); song 1 section D (a whole project); song 2: four sections (whole projects); song 3: four sections (whole projects); song 4: four sections (whole projects) (some of it lost); song 5: four sections (whole projects); song 6: four sections (whole projects); song 7: four sections (whole projects); song 8: four sections (whole projects); which song is current, every song's rows and scenes; user sounds U01-U16 (converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ); user sounds U17-U32 (converted when read, written back at your next save in that bank; all bank records are rewritten after in-RAM migration; firmware-specific sounds can differ). Carried over: FM6 patches of the FM6 user sounds. After JIANT with its default CLICK LEVEL, GHOULBOX turns RESTORE LAST ON during import and autosaves by itself after edits and quiet, regardless of the earlier RESTORE LAST choice. A saved LOW click level is the exception: other saved preferences can leave autosave OFF. Check RESTORE LAST after importing LOW-click-level settings.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "melodee",
    "name": "Melodee",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared user presets U037-U054",
      "effect": "lost",
      "ways": [
       {
        "way": "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)"
   },
   {
    "from": "fomni",
    "name": "FoMni",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FoMni setup (pages, chord buttons, lights)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send settings from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FoMni button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). At risk when you act: FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "amb",
    "name": "AMB-1",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you 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": "AMB-1 panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: AMB-1 pieces and setup. At risk when you act: AMB-1 panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "choralroot",
    "name": "ChoralRoot",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "options, playing setup and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "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": "32 imported DX7 voices",
      "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": "CZ-1 bank A (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank B (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank C (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank D (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank E (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank F (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank G (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank H (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last global-save session",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "favourite marks, chord/bass type and filter",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "128 saved sounds with their complete engine patches",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: options, playing setup and panel calibration. At risk by itself, under a condition: 32 imported DX7 voices. 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; recorded loop 1; recorded loop 2; recorded loop 3; recorded loop 4; recorded loop 5; recorded loop 6; recorded loop 7; recorded loop 8; recorded loop 9; recorded loop 10.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Open shared sample audio",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself as you use it (its RESTORE LAST is on by default)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if a compatible staged bank survives and is newer than home, or home is invalid",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if no valid UPF6 exists and a valid old type-7 FM6B bank survives",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a backup or import a project",
        "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 editor",
        "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 save an FM6 user preset (no question; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you send an FM6 user patch",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you send an FM6 voice bank",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you send settings from the editor",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Open USER project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open device preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install GHOULBOX (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Installing this firmware replaces Open’s sixteen USER projects, preferences and sample header before its first start, including the first 24 KiB of sample storage. This follows Open’s source-defined USER layout and the incoming program range; export projects and device samples before leaving Open."
    ],
    "owner_text": "At risk by itself: Open shared sample audio. At risk when you act: Open USER project 1; Open USER project 2; Open USER project 3; Open USER project 4; Open USER project 5; Open USER project 6; Open USER project 7; Open USER project 8; Open USER project 9; Open USER project 10; Open USER project 11; Open USER project 12; Open USER project 13; Open USER project 14; Open USER project 15; Open USER project 16; Open device preferences. Installing this firmware replaces Open’s sixteen USER projects, preferences and sample header before its first start, including the first 24 KiB of sample storage. This follows Open’s source-defined USER layout and the incoming program range; export projects and device samples before leaving Open.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm106",
    "name": "FM-106",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "octave, last selected preset and MIDI preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send settings from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older stored user bank, if present (Beta4 does not store new edits)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls."
    ],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences. At risk when you act: older stored user bank, if present (Beta4 does not store new edits). A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "hortator",
    "name": "Hortator",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import"
       },
       {
        "way": "when you erase a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import"
       },
       {
        "way": "when you restore a backup",
        "effect": "converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import"
       },
       {
        "way": "when you send settings from the editor",
        "effect": "converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import"
       }
      ]
     },
     {
      "object": "project A",
      "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 B",
      "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 C",
      "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 D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user samples USR1 (sample loop and slice behaviour follow this reader’s engines)",
     "user samples USR2 (sample loop and slice behaviour follow this reader’s engines)",
     "user samples USR3 (sample loop and slice behaviour follow this reader’s engines)"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings and panel calibration (converted: After this firmware writes its newer settings format, returning to Hortator starts settings, panel calibration and the remembered Bluetooth device from defaults. It does not retry an older copy just because the newest record is too large; settings convert when read; next save writes a newer format the previous firmware cannot import). At risk when you act: project A; project B; project C; project D. Carried over: user samples USR1 (sample loop and slice behaviour follow this reader’s engines); user samples USR2 (sample loop and slice behaviour follow this reader’s engines); user samples USR3 (sample loop and slice behaviour follow this reader’s engines).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "obervave",
    "name": "OberVave",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you 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": "pattern 1",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup [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 send settings from the editor [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 2",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup [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 send settings from the editor [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 3",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup [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 send settings from the editor [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 4",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup [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 send settings from the editor [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 5",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup [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 send settings from the editor [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 6",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup [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 send settings from the editor [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 7",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup [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 send settings from the editor [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 8",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup [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 send settings from the editor [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: saved programs and global settings; pattern 1 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 2 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 3 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 4 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 5 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 6 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 7 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 8 (its B-track sound can change if it uses a saved program; its pattern notes remain).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "polly",
    "name": "Polly",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Optional QY70 style bank",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it (its RESTORE LAST is on by default)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if a compatible staged bank survives and is newer than home, or home is invalid",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Polly setup and channel sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send settings from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 4",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if no valid UPF6 exists and a valid old type-7 FM6B bank survives",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user patch",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "All four Polly songs",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup or import a project",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send user presets from the editor",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "With no readable older Felucca-family settings copy left, GHOULBOX starts with RESTORE LAST ON and autosaves by itself after edits and quiet."
    ],
    "owner_text": "At risk by itself: Optional QY70 style bank; Polly setup and channel sounds. At risk by itself, under a condition: Polly shared memory 4. At risk when you act: All four Polly songs; Polly shared memory 1; Polly shared memory 2; Polly shared memory 3; Polly shared memory 5; Polly shared memory 6; Polly shared memory 7; Polly shared memory 8; Polly shared memory 9; Polly shared memory 10; Polly shared memory 11; Polly shared memory 12; Polly shared memory 13; Polly shared memory 14; Polly shared memory 15; Polly shared memory 16; Polly button and encoder calibration. With no readable older Felucca-family settings copy left, GHOULBOX starts with RESTORE LAST ON and autosaves by itself after edits and quiet.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "skiff",
    "name": "Skiff",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "last session",
      "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 compatible staged bank survives and is newer than home, or home is invalid [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you send an FM6 voice bank",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, calibration and favourites",
      "effect": "changed by itself: Imports the shared 572-byte PER4 settings and panel calibration. Skiff stores CLOCK, MIDI IN and TUNE in preference bytes 18–20, PRESETS LIST in 21, HINTS OFF in 22, settings revision in 23, its scene-freed marker in 24, PERFORM KEYS in 25, LAUNCH in 26, SCREEN OFF in 27 and CLICK/FEEL in 28. GHOULBOX reads bytes 18–23 as FX key assignments and byte 24 as SCOPE MIX, STEP PREVIEW, CHORD ENTRY and NOTE NAMES choices. PERFORM KEYS becomes SCREEN OFF: Skiff’s SCENE choice gives a 15-minute idle timeout. LAUNCH becomes HOME: Skiff’s BAR choice gives TRACKS. SCREEN OFF becomes SCENE, while byte 12 supplies CLICK preferences. Byte 28 holds GHOULBOX import marks; with Skiff’s default CLICK LEVEL, its one-time migration turns RESTORE LAST ON. The shared record does not give matching preference meanings; also, shared settings bytes select different preferences",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "changed by itself: Imports the shared 572-byte PER4 settings and panel calibration. Skiff stores CLOCK, MIDI IN and TUNE in preference bytes 18–20, PRESETS LIST in 21, HINTS OFF in 22, settings revision in 23, its scene-freed marker in 24, PERFORM KEYS in 25, LAUNCH in 26, SCREEN OFF in 27 and CLICK/FEEL in 28. GHOULBOX reads bytes 18–23 as FX key assignments and byte 24 as SCOPE MIX, STEP PREVIEW, CHORD ENTRY and NOTE NAMES choices. PERFORM KEYS becomes SCREEN OFF: Skiff’s SCENE choice gives a 15-minute idle timeout. LAUNCH becomes HOME: Skiff’s BAR choice gives TRACKS. SCREEN OFF becomes SCENE, while byte 12 supplies CLICK preferences. Byte 28 holds GHOULBOX import marks; with Skiff’s default CLICK LEVEL, its one-time migration turns RESTORE LAST ON. The shared record does not give matching preference meanings; also, shared settings bytes select different preferences"
       },
       {
        "way": "when you erase a user preset (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "changed by itself: Imports the shared 572-byte PER4 settings and panel calibration. Skiff stores CLOCK, MIDI IN and TUNE in preference bytes 18–20, PRESETS LIST in 21, HINTS OFF in 22, settings revision in 23, its scene-freed marker in 24, PERFORM KEYS in 25, LAUNCH in 26, SCREEN OFF in 27 and CLICK/FEEL in 28. GHOULBOX reads bytes 18–23 as FX key assignments and byte 24 as SCOPE MIX, STEP PREVIEW, CHORD ENTRY and NOTE NAMES choices. PERFORM KEYS becomes SCREEN OFF: Skiff’s SCENE choice gives a 15-minute idle timeout. LAUNCH becomes HOME: Skiff’s BAR choice gives TRACKS. SCREEN OFF becomes SCENE, while byte 12 supplies CLICK preferences. Byte 28 holds GHOULBOX import marks; with Skiff’s default CLICK LEVEL, its one-time migration turns RESTORE LAST ON. The shared record does not give matching preference meanings; also, shared settings bytes select different preferences"
       },
       {
        "way": "when you restore a backup",
        "effect": "changed by itself: Imports the shared 572-byte PER4 settings and panel calibration. Skiff stores CLOCK, MIDI IN and TUNE in preference bytes 18–20, PRESETS LIST in 21, HINTS OFF in 22, settings revision in 23, its scene-freed marker in 24, PERFORM KEYS in 25, LAUNCH in 26, SCREEN OFF in 27 and CLICK/FEEL in 28. GHOULBOX reads bytes 18–23 as FX key assignments and byte 24 as SCOPE MIX, STEP PREVIEW, CHORD ENTRY and NOTE NAMES choices. PERFORM KEYS becomes SCREEN OFF: Skiff’s SCENE choice gives a 15-minute idle timeout. LAUNCH becomes HOME: Skiff’s BAR choice gives TRACKS. SCREEN OFF becomes SCENE, while byte 12 supplies CLICK preferences. Byte 28 holds GHOULBOX import marks; with Skiff’s default CLICK LEVEL, its one-time migration turns RESTORE LAST ON. The shared record does not give matching preference meanings; also, shared settings bytes select different preferences"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "changed by itself: Imports the shared 572-byte PER4 settings and panel calibration. Skiff stores CLOCK, MIDI IN and TUNE in preference bytes 18–20, PRESETS LIST in 21, HINTS OFF in 22, settings revision in 23, its scene-freed marker in 24, PERFORM KEYS in 25, LAUNCH in 26, SCREEN OFF in 27 and CLICK/FEEL in 28. GHOULBOX reads bytes 18–23 as FX key assignments and byte 24 as SCOPE MIX, STEP PREVIEW, CHORD ENTRY and NOTE NAMES choices. PERFORM KEYS becomes SCREEN OFF: Skiff’s SCENE choice gives a 15-minute idle timeout. LAUNCH becomes HOME: Skiff’s BAR choice gives TRACKS. SCREEN OFF becomes SCENE, while byte 12 supplies CLICK preferences. Byte 28 holds GHOULBOX import marks; with Skiff’s default CLICK LEVEL, its one-time migration turns RESTORE LAST ON. The shared record does not give matching preference meanings; also, shared settings bytes select different preferences"
       },
       {
        "way": "when you send settings from the editor",
        "effect": "changed by itself: Imports the shared 572-byte PER4 settings and panel calibration. Skiff stores CLOCK, MIDI IN and TUNE in preference bytes 18–20, PRESETS LIST in 21, HINTS OFF in 22, settings revision in 23, its scene-freed marker in 24, PERFORM KEYS in 25, LAUNCH in 26, SCREEN OFF in 27 and CLICK/FEEL in 28. GHOULBOX reads bytes 18–23 as FX key assignments and byte 24 as SCOPE MIX, STEP PREVIEW, CHORD ENTRY and NOTE NAMES choices. PERFORM KEYS becomes SCREEN OFF: Skiff’s SCENE choice gives a 15-minute idle timeout. LAUNCH becomes HOME: Skiff’s BAR choice gives TRACKS. SCREEN OFF becomes SCENE, while byte 12 supplies CLICK preferences. Byte 28 holds GHOULBOX import marks; with Skiff’s default CLICK LEVEL, its one-time migration turns RESTORE LAST ON. The shared record does not give matching preference meanings; also, shared settings bytes select different preferences"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a compatible staged bank survives and is newer than home, or home is invalid [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "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"
       },
       {
        "way": "when you send an FM6 voice bank [through its shared pattern pool]",
        "effect": "some or all of it lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a compatible staged bank survives and is newer than home, or home is invalid [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "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"
       },
       {
        "way": "when you send an FM6 voice bank [through its shared pattern pool]",
        "effect": "some or all of it lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a compatible staged bank survives and is newer than home, or home is invalid [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "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"
       },
       {
        "way": "when you send an FM6 voice bank [through its shared pattern pool]",
        "effect": "some or all of it lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a compatible staged bank survives and is newer than home, or home is invalid [through its shared pattern pool]",
        "effect": "some or all of it lost"
       },
       {
        "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"
       },
       {
        "way": "when you send an FM6 voice bank [through its shared pattern pool]",
        "effect": "some or all of it lost"
       }
      ]
     },
     {
      "object": "shared 64-pattern pool",
      "effect": "some or all of it lost",
      "ways": [
       {
        "way": "by itself, only if a compatible staged bank survives and is newer than home, or home is invalid",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you send an FM6 voice bank",
        "effect": "some or all of it lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sounds’ own FM6 patches (each patch must still match its FM6 user record)",
     "user sample USR1 (sample loop and slice behaviour follow this reader’s engines)",
     "user sample USR2 (sample loop and slice behaviour follow this reader’s engines)",
     "user sample USR3 (sample loop and slice behaviour follow this reader’s engines)",
     "user sound bank 1 (DRUM-X sounds are empty or a different engine; shared names do not guarantee shared sound)",
     "user sound bank 2 (DRUM-X sounds are empty or a different engine; shared names do not guarantee shared sound)"
    ],
    "kept_unseen": [],
    "notes": [
     "With Skiff’s default CLICK LEVEL, GHOULBOX’s import migrations force RESTORE LAST ON and autosave writes by itself after edits and quiet. A saved LOW click level can suppress that migration and leave autosave OFF; check RESTORE LAST after import."
    ],
    "owner_text": "At risk by itself: last session; settings, calibration and favourites (changed by itself: Imports the shared 572-byte PER4 settings and panel calibration. Skiff stores CLOCK, MIDI IN and TUNE in preference bytes 18–20, PRESETS LIST in 21, HINTS OFF in 22, settings revision in 23, its scene-freed marker in 24, PERFORM KEYS in 25, LAUNCH in 26, SCREEN OFF in 27 and CLICK/FEEL in 28. GHOULBOX reads bytes 18–23 as FX key assignments and byte 24 as SCOPE MIX, STEP PREVIEW, CHORD ENTRY and NOTE NAMES choices. PERFORM KEYS becomes SCREEN OFF: Skiff’s SCENE choice gives a 15-minute idle timeout. LAUNCH becomes HOME: Skiff’s BAR choice gives TRACKS. SCREEN OFF becomes SCENE, while byte 12 supplies CLICK preferences. Byte 28 holds GHOULBOX import marks; with Skiff’s default CLICK LEVEL, its one-time migration turns RESTORE LAST ON. The shared record does not give matching preference meanings; also, shared settings bytes select different preferences). At risk by itself, under a condition: project A; project B; project C; project D; shared 64-pattern pool (some or all of it lost). Carried over: user sounds’ own FM6 patches (each patch must still match its FM6 user record); user sample USR1 (sample loop and slice behaviour follow this reader’s engines); user sample USR2 (sample loop and slice behaviour follow this reader’s engines); user sample USR3 (sample loop and slice behaviour follow this reader’s engines); user sound bank 1 (DRUM-X sounds are empty or a different engine; shared names do not guarantee shared sound); user sound bank 2 (DRUM-X sounds are empty or a different engine; shared names do not guarantee shared sound). With Skiff’s default CLICK LEVEL, GHOULBOX’s import migrations force RESTORE LAST ON and autosave writes by itself after edits and quiet. A saved LOW click level can suppress that migration and leave autosave OFF; check RESTORE LAST after import.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ],
  "when_you_leave": [
   {
    "to": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "project A",
     "project B",
     "project C",
     "project D",
     "FM6 patches for user sounds",
     "user sample slot USR1",
     "user sample slot USR2",
     "user sample slot USR3",
     "user sounds 1–16",
     "user sounds 17–32",
     "music in progress (RESTORE LAST)",
     "FM6 voice bank B1–B32"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): project A; project B; project C; project D; FM6 patches for user sounds; user sample slot USR1; user sample slot USR2; user sample slot USR3; user sounds 1–16; user sounds 17–32; music in progress (RESTORE LAST); FM6 voice bank B1–B32.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "baudgirl",
    "name": "Baud Girl FM-1+VA",
    "flags": "?",
    "weakest_grade": "inferred",
    "at_risk": [],
    "possibly_at_risk": [
     "project A",
     "project B",
     "project C",
     "project D",
     "FM6 patches for user sounds",
     "user sample slot USR1",
     "user sample slot USR2",
     "user sample slot USR3",
     "user sounds 1–16",
     "user sounds 17–32",
     "music in progress (RESTORE LAST)",
     "FM6 voice bank B1–B32"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): project A; project B; project C; project D; FM6 patches for user sounds; user sample slot USR1; user sample slot USR2; user sample slot USR3; user sounds 1–16; user sounds 17–32; music in progress (RESTORE LAST); FM6 voice bank B1–B32.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "felucca",
    "name": "Felucca",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "changed by itself: Normalizes GHOULBOX’s migration markers as CLICK preferences in RAM; the next settings save persists them, and a later return to GHOULBOX can turn RESTORE LAST OFF; CLICK REC can add an unselected CUSTOM colour choice; SCENE becomes SCREEN OFF and SCREEN OFF becomes the LED-invert level; also, different shared preference meanings; a settings round trip can turn GHOULBOX RESTORE LAST OFF; CLICK REC can add CUSTOM under COLOR without selecting it, and scene/screen settings are reused",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "changed by itself: Normalizes GHOULBOX’s migration markers as CLICK preferences in RAM; the next settings save persists them, and a later return to GHOULBOX can turn RESTORE LAST OFF; CLICK REC can add an unselected CUSTOM colour choice; SCENE becomes SCREEN OFF and SCREEN OFF becomes the LED-invert level; also, different shared preference meanings; a settings round trip can turn GHOULBOX RESTORE LAST OFF; CLICK REC can add CUSTOM under COLOR without selecting it, and scene/screen settings are reused"
       },
       {
        "way": "by itself, only if its 2ND CORE is on and a render job fails or times out",
        "effect": "changed by itself: Normalizes GHOULBOX’s migration markers as CLICK preferences in RAM; the next settings save persists them, and a later return to GHOULBOX can turn RESTORE LAST OFF; CLICK REC can add an unselected CUSTOM colour choice; SCENE becomes SCREEN OFF and SCREEN OFF becomes the LED-invert level; also, different shared preference meanings; a settings round trip can turn GHOULBOX RESTORE LAST OFF; CLICK REC can add CUSTOM under COLOR without selecting it, and scene/screen settings are reused"
       },
       {
        "way": "when you erase a user preset (it asks or arms a second turn first)",
        "effect": "changed by itself: Normalizes GHOULBOX’s migration markers as CLICK preferences in RAM; the next settings save persists them, and a later return to GHOULBOX can turn RESTORE LAST OFF; CLICK REC can add an unselected CUSTOM colour choice; SCENE becomes SCREEN OFF and SCREEN OFF becomes the LED-invert level; also, different shared preference meanings; a settings round trip can turn GHOULBOX RESTORE LAST OFF; CLICK REC can add CUSTOM under COLOR without selecting it, and scene/screen settings are reused"
       },
       {
        "way": "when you learn MIDI CCs (no question)",
        "effect": "changed by itself: Normalizes GHOULBOX’s migration markers as CLICK preferences in RAM; the next settings save persists them, and a later return to GHOULBOX can turn RESTORE LAST OFF; CLICK REC can add an unselected CUSTOM colour choice; SCENE becomes SCREEN OFF and SCREEN OFF becomes the LED-invert level; also, different shared preference meanings; a settings round trip can turn GHOULBOX RESTORE LAST OFF; CLICK REC can add CUSTOM under COLOR without selecting it, and scene/screen settings are reused"
       },
       {
        "way": "when you restore a backup from the web editor",
        "effect": "changed by itself: Normalizes GHOULBOX’s migration markers as CLICK preferences in RAM; the next settings save persists them, and a later return to GHOULBOX can turn RESTORE LAST OFF; CLICK REC can add an unselected CUSTOM colour choice; SCENE becomes SCREEN OFF and SCREEN OFF becomes the LED-invert level; also, different shared preference meanings; a settings round trip can turn GHOULBOX RESTORE LAST OFF; CLICK REC can add CUSTOM under COLOR without selecting it, and scene/screen settings are reused"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "changed by itself: Normalizes GHOULBOX’s migration markers as CLICK preferences in RAM; the next settings save persists them, and a later return to GHOULBOX can turn RESTORE LAST OFF; CLICK REC can add an unselected CUSTOM colour choice; SCENE becomes SCREEN OFF and SCREEN OFF becomes the LED-invert level; also, different shared preference meanings; a settings round trip can turn GHOULBOX RESTORE LAST OFF; CLICK REC can add CUSTOM under COLOR without selecting it, and scene/screen settings are reused"
       },
       {
        "way": "when you send data from the web editor",
        "effect": "changed by itself: Normalizes GHOULBOX’s migration markers as CLICK preferences in RAM; the next settings save persists them, and a later return to GHOULBOX can turn RESTORE LAST OFF; CLICK REC can add an unselected CUSTOM colour choice; SCENE becomes SCREEN OFF and SCREEN OFF becomes the LED-invert level; also, different shared preference meanings; a settings round trip can turn GHOULBOX RESTORE LAST OFF; CLICK REC can add CUSTOM under COLOR without selecting it, and scene/screen settings are reused"
       }
      ]
     },
     {
      "object": "music in progress (RESTORE LAST)",
      "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",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A",
      "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": "project B",
      "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": "project C",
      "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": "project D",
      "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": "user sounds 1–16",
      "effect": "converted when read, written back at your next save in that bank; GURDY records show unused; shared bank writes retain their bytes until overwritten",
      "ways": [
       {
        "way": "when you erase a slot (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; GURDY records show unused; shared bank writes retain their bytes until overwritten"
       },
       {
        "way": "when you rename a slot (no question; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; GURDY records show unused; shared bank writes retain their bytes until overwritten"
       },
       {
        "way": "when you restore a backup from the web editor",
        "effect": "converted when read, written back at your next save in that bank; GURDY records show unused; shared bank writes retain their bytes until overwritten"
       },
       {
        "way": "when you save a user preset (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; GURDY records show unused; shared bank writes retain their bytes until overwritten"
       },
       {
        "way": "when you send data from the web editor",
        "effect": "converted when read, written back at your next save in that bank; GURDY records show unused; shared bank writes retain their bytes until overwritten"
       }
      ]
     },
     {
      "object": "user sounds 17–32",
      "effect": "converted when read, written back at your next save in that bank; GURDY records show unused; shared bank writes retain their bytes until overwritten",
      "ways": [
       {
        "way": "when you erase a slot (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; GURDY records show unused; shared bank writes retain their bytes until overwritten"
       },
       {
        "way": "when you rename a slot (no question; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; GURDY records show unused; shared bank writes retain their bytes until overwritten"
       },
       {
        "way": "when you restore a backup from the web editor",
        "effect": "converted when read, written back at your next save in that bank; GURDY records show unused; shared bank writes retain their bytes until overwritten"
       },
       {
        "way": "when you save a user preset (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; GURDY records show unused; shared bank writes retain their bytes until overwritten"
       },
       {
        "way": "when you send data from the web editor",
        "effect": "converted when read, written back at your next save in that bank; GURDY records show unused; shared bank writes retain their bytes until overwritten"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "FM6 patches for user sounds",
     "user sample slot USR1",
     "user sample slot USR2",
     "user sample slot USR3",
     "FM6 voice bank B1–B32"
    ],
    "kept_unseen": [],
    "notes": [
     "GHOULBOX’s default RESTORE LAST ON leaves Felucca’s autosave ON; a saved OFF choice leaves it OFF."
    ],
    "owner_text": "At risk by itself: settings and panel calibration (changed by itself: Normalizes GHOULBOX’s migration markers as CLICK preferences in RAM; the next settings save persists them, and a later return to GHOULBOX can turn RESTORE LAST OFF; CLICK REC can add an unselected CUSTOM colour choice; SCENE becomes SCREEN OFF and SCREEN OFF becomes the LED-invert level; also, different shared preference meanings; a settings round trip can turn GHOULBOX RESTORE LAST OFF; CLICK REC can add CUSTOM under COLOR without selecting it, and scene/screen settings are reused). At risk by itself, under a condition: music in progress (RESTORE LAST). At risk when you act: project A; project B; project C; project D; user sounds 1–16 (converted when read, written back at your next save in that bank; GURDY records show unused; shared bank writes retain their bytes until overwritten); user sounds 17–32 (converted when read, written back at your next save in that bank; GURDY records show unused; shared bank writes retain their bytes until overwritten). Carried over: FM6 patches for user sounds; user sample slot USR1; user sample slot USR2; user sample slot USR3; FM6 voice bank B1–B32. GHOULBOX’s default RESTORE LAST ON leaves Felucca’s autosave ON; a saved OFF choice leaves it OFF.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "sloop",
    "name": "SLOOP",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FM6 patches for user sounds",
      "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 and panel calibration",
      "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": "project A",
      "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 B",
      "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 C",
      "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 D",
      "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": "music in progress (RESTORE LAST)",
      "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": "FM6 voice bank B1–B32",
      "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": [
     "user sample slot USR1",
     "user sample slot USR2",
     "user sample slot USR3"
    ],
    "kept_unseen": [
     "user sounds 1–16 (new GHOULBOX presets show unused; saving into that slot replaces them without an overwrite question)",
     "user sounds 17–32 (new GHOULBOX presets show unused; saving into that slot replaces them without an overwrite question)"
    ],
    "notes": [],
    "owner_text": "At risk by itself: FM6 patches for user sounds; settings and panel calibration. At risk when you act: project A; project B; project C; project D; music in progress (RESTORE LAST); FM6 voice bank B1–B32. Carried over: user sample slot USR1; user sample slot USR2; user sample slot USR3. Kept but not shown: user sounds 1–16 (new GHOULBOX presets show unused; saving into that slot replaces them without an overwrite question); user sounds 17–32 (new GHOULBOX presets show unused; saving into that slot replaces them without an overwrite question).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "x0x",
    "name": "X0X",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "project A",
      "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": "project B",
      "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": "project C",
      "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": "project D",
      "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": "user sounds 17–32",
      "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 and panel calibration",
      "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": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sample slot USR1",
     "user sample slot USR2",
     "user sample slot USR3"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: project A; project B; project C; project D; user sounds 17–32; settings and panel calibration. At risk when you act: user sounds 1–16. Carried over: user sample slot USR1; user sample slot USR2; user sample slot USR3.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "jiant",
    "name": "JIANT",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "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 select a song through MIDI PROGRAM CHANGE (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you store a section (no question)",
        "effect": "lost"
       },
       {
        "way": "when you switch song or project (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "settings and panel calibration",
      "effect": "changed by itself: Reuses FX key-map preferences for USB stems, USB level and the palette marker; may clear CHORD ENTRY ADD; HOME becomes LOAD. On first-start revision update, saves revision 2, which GHOULBOX later reads as SCREEN OFF code 2. The shared RESTORE LAST choice has the opposite meaning; a settings round trip can also turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW can select MIDI OUT CLOCK/ALL/OFF, or be cleared with CHORD ENTRY ADD; KNOB ACCEL is inverted; SCENE becomes SCREEN OFF; first-start revision update also turns FX LATCH OFF; also, shared bytes change USB, palette, chord-entry, HOME and screen preferences; RESTORE LAST has the opposite meaning and a round trip can turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW become MIDI OUT or are cleared, KNOB ACCEL is inverted, SCENE becomes SCREEN OFF and first-start revision update turns FX LATCH OFF",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "changed by itself: Reuses FX key-map preferences for USB stems, USB level and the palette marker; may clear CHORD ENTRY ADD; HOME becomes LOAD. On first-start revision update, saves revision 2, which GHOULBOX later reads as SCREEN OFF code 2. The shared RESTORE LAST choice has the opposite meaning; a settings round trip can also turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW can select MIDI OUT CLOCK/ALL/OFF, or be cleared with CHORD ENTRY ADD; KNOB ACCEL is inverted; SCENE becomes SCREEN OFF; first-start revision update also turns FX LATCH OFF; also, shared bytes change USB, palette, chord-entry, HOME and screen preferences; RESTORE LAST has the opposite meaning and a round trip can turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW become MIDI OUT or are cleared, KNOB ACCEL is inverted, SCENE becomes SCREEN OFF and first-start revision update turns FX LATCH OFF"
       },
       {
        "way": "by itself as you use it",
        "effect": "changed by itself: Reuses FX key-map preferences for USB stems, USB level and the palette marker; may clear CHORD ENTRY ADD; HOME becomes LOAD. On first-start revision update, saves revision 2, which GHOULBOX later reads as SCREEN OFF code 2. The shared RESTORE LAST choice has the opposite meaning; a settings round trip can also turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW can select MIDI OUT CLOCK/ALL/OFF, or be cleared with CHORD ENTRY ADD; KNOB ACCEL is inverted; SCENE becomes SCREEN OFF; first-start revision update also turns FX LATCH OFF; also, shared bytes change USB, palette, chord-entry, HOME and screen preferences; RESTORE LAST has the opposite meaning and a round trip can turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW become MIDI OUT or are cleared, KNOB ACCEL is inverted, SCENE becomes SCREEN OFF and first-start revision update turns FX LATCH OFF"
       },
       {
        "way": "when you change settings from the web editor (no question)",
        "effect": "changed by itself: Reuses FX key-map preferences for USB stems, USB level and the palette marker; may clear CHORD ENTRY ADD; HOME becomes LOAD. On first-start revision update, saves revision 2, which GHOULBOX later reads as SCREEN OFF code 2. The shared RESTORE LAST choice has the opposite meaning; a settings round trip can also turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW can select MIDI OUT CLOCK/ALL/OFF, or be cleared with CHORD ENTRY ADD; KNOB ACCEL is inverted; SCENE becomes SCREEN OFF; first-start revision update also turns FX LATCH OFF; also, shared bytes change USB, palette, chord-entry, HOME and screen preferences; RESTORE LAST has the opposite meaning and a round trip can turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW become MIDI OUT or are cleared, KNOB ACCEL is inverted, SCENE becomes SCREEN OFF and first-start revision update turns FX LATCH OFF"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "changed by itself: Reuses FX key-map preferences for USB stems, USB level and the palette marker; may clear CHORD ENTRY ADD; HOME becomes LOAD. On first-start revision update, saves revision 2, which GHOULBOX later reads as SCREEN OFF code 2. The shared RESTORE LAST choice has the opposite meaning; a settings round trip can also turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW can select MIDI OUT CLOCK/ALL/OFF, or be cleared with CHORD ENTRY ADD; KNOB ACCEL is inverted; SCENE becomes SCREEN OFF; first-start revision update also turns FX LATCH OFF; also, shared bytes change USB, palette, chord-entry, HOME and screen preferences; RESTORE LAST has the opposite meaning and a round trip can turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW become MIDI OUT or are cleared, KNOB ACCEL is inverted, SCENE becomes SCREEN OFF and first-start revision update turns FX LATCH OFF"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "changed by itself: Reuses FX key-map preferences for USB stems, USB level and the palette marker; may clear CHORD ENTRY ADD; HOME becomes LOAD. On first-start revision update, saves revision 2, which GHOULBOX later reads as SCREEN OFF code 2. The shared RESTORE LAST choice has the opposite meaning; a settings round trip can also turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW can select MIDI OUT CLOCK/ALL/OFF, or be cleared with CHORD ENTRY ADD; KNOB ACCEL is inverted; SCENE becomes SCREEN OFF; first-start revision update also turns FX LATCH OFF; also, shared bytes change USB, palette, chord-entry, HOME and screen preferences; RESTORE LAST has the opposite meaning and a round trip can turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW become MIDI OUT or are cleared, KNOB ACCEL is inverted, SCENE becomes SCREEN OFF and first-start revision update turns FX LATCH OFF"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "changed by itself: Reuses FX key-map preferences for USB stems, USB level and the palette marker; may clear CHORD ENTRY ADD; HOME becomes LOAD. On first-start revision update, saves revision 2, which GHOULBOX later reads as SCREEN OFF code 2. The shared RESTORE LAST choice has the opposite meaning; a settings round trip can also turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW can select MIDI OUT CLOCK/ALL/OFF, or be cleared with CHORD ENTRY ADD; KNOB ACCEL is inverted; SCENE becomes SCREEN OFF; first-start revision update also turns FX LATCH OFF; also, shared bytes change USB, palette, chord-entry, HOME and screen preferences; RESTORE LAST has the opposite meaning and a round trip can turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW become MIDI OUT or are cleared, KNOB ACCEL is inverted, SCENE becomes SCREEN OFF and first-start revision update turns FX LATCH OFF"
       }
      ]
     },
     {
      "object": "music in progress (RESTORE LAST)",
      "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": "FM6 voice bank B1–B32",
      "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": "project A",
      "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",
      "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",
      "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",
      "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": "user sample slot USR1",
      "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": "user sample slot USR2",
      "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": "user sounds 1–16",
      "effect": "converted when read, written back at your next save in that bank; whole-bank conversion changes FM6 fingerprints and can detach GHOULBOX patches; GURDY slots look empty in JIANT and a save replaces them without asking",
      "ways": [
       {
        "way": "when you erase a slot (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; whole-bank conversion changes FM6 fingerprints and can detach GHOULBOX patches; GURDY slots look empty in JIANT and a save replaces them without asking"
       },
       {
        "way": "when you rename a slot (no question; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; whole-bank conversion changes FM6 fingerprints and can detach GHOULBOX patches; GURDY slots look empty in JIANT and a save replaces them without asking"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "converted when read, written back at your next save in that bank; whole-bank conversion changes FM6 fingerprints and can detach GHOULBOX patches; GURDY slots look empty in JIANT and a save replaces them without asking"
       },
       {
        "way": "when you save a user preset (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; whole-bank conversion changes FM6 fingerprints and can detach GHOULBOX patches; GURDY slots look empty in JIANT and a save replaces them without asking"
       },
       {
        "way": "when you send data from the web editor (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; whole-bank conversion changes FM6 fingerprints and can detach GHOULBOX patches; GURDY slots look empty in JIANT and a save replaces them without asking"
       }
      ]
     },
     {
      "object": "user sounds 17–32",
      "effect": "converted when read, written back at your next save in that bank; whole-bank conversion changes FM6 fingerprints and can detach GHOULBOX patches; GURDY slots look empty in JIANT and a save replaces them without asking",
      "ways": [
       {
        "way": "when you erase a slot (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; whole-bank conversion changes FM6 fingerprints and can detach GHOULBOX patches; GURDY slots look empty in JIANT and a save replaces them without asking"
       },
       {
        "way": "when you rename a slot (no question; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; whole-bank conversion changes FM6 fingerprints and can detach GHOULBOX patches; GURDY slots look empty in JIANT and a save replaces them without asking"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "converted when read, written back at your next save in that bank; whole-bank conversion changes FM6 fingerprints and can detach GHOULBOX patches; GURDY slots look empty in JIANT and a save replaces them without asking"
       },
       {
        "way": "when you save a user preset (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; whole-bank conversion changes FM6 fingerprints and can detach GHOULBOX patches; GURDY slots look empty in JIANT and a save replaces them without asking"
       },
       {
        "way": "when you send data from the web editor (no question when the target slot is empty; it rewrites the whole bank)",
        "effect": "converted when read, written back at your next save in that bank; whole-bank conversion changes FM6 fingerprints and can detach GHOULBOX patches; GURDY slots look empty in JIANT and a save replaces them without asking"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "FM6 patches for user sounds"
    ],
    "kept_unseen": [],
    "notes": [
     "GHOULBOX’s default RESTORE LAST ON leaves JIANT’s autosave OFF; a saved OFF choice turns it ON."
    ],
    "owner_text": "At risk by itself: user sample slot USR3; settings and panel calibration (changed by itself: Reuses FX key-map preferences for USB stems, USB level and the palette marker; may clear CHORD ENTRY ADD; HOME becomes LOAD. On first-start revision update, saves revision 2, which GHOULBOX later reads as SCREEN OFF code 2. The shared RESTORE LAST choice has the opposite meaning; a settings round trip can also turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW can select MIDI OUT CLOCK/ALL/OFF, or be cleared with CHORD ENTRY ADD; KNOB ACCEL is inverted; SCENE becomes SCREEN OFF; first-start revision update also turns FX LATCH OFF; also, shared bytes change USB, palette, chord-entry, HOME and screen preferences; RESTORE LAST has the opposite meaning and a round trip can turn GHOULBOX autosave OFF; SCOPE MIX/STEP PREVIEW become MIDI OUT or are cleared, KNOB ACCEL is inverted, SCENE becomes SCREEN OFF and first-start revision update turns FX LATCH OFF). At risk by itself, under a condition: music in progress (RESTORE LAST); FM6 voice bank B1–B32. At risk when you act: project A; project B; project C; project D; user sample slot USR1; user sample slot USR2; user sounds 1–16 (converted when read, written back at your next save in that bank; whole-bank conversion changes FM6 fingerprints and can detach GHOULBOX patches; GURDY slots look empty in JIANT and a save replaces them without asking); user sounds 17–32 (converted when read, written back at your next save in that bank; whole-bank conversion changes FM6 fingerprints and can detach GHOULBOX patches; GURDY slots look empty in JIANT and a save replaces them without asking). Carried over: FM6 patches for user sounds. GHOULBOX’s default RESTORE LAST ON leaves JIANT’s autosave OFF; a saved OFF choice turns it ON.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "melodee",
    "name": "Melodee",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "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)"
   },
   {
    "to": "fomni",
    "name": "FoMni",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings and panel calibration. At risk when you act: user sounds 1–16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "amb",
    "name": "AMB-1",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings and panel calibration. At risk when you act: user sounds 1–16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "choralroot",
    "name": "ChoralRoot",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "user sample slot USR2",
      "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": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if no pool bank exists and at least one legacy UPB1/192 sound passes validation",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you choose Overwrite or Save as new and accept with OCT+ or SAVE (no question; it rewrites the whole bank)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm 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": "damaged (part of it written over)"
       },
       {
        "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": "damaged (part of it written over)"
       },
       {
        "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": "damaged (part of it written over)"
       },
       {
        "way": "when you restore settings, which also writes an empty session record from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "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 40; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore loop id 41; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 42; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 43; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 44; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 45; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 46; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 47; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 48; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you restore loop id 49; zero-length PUT deletes both copies from backup software (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "settings and panel calibration",
      "effect": "converted: After ChoralRoot saves its newer settings format, returning to GHOULBOX starts preferences and panel calibration from defaults; it cannot read the newer record and does not retry the older copy merely because the format changed; on entering ChoralRoot, panel calibration and HOLD can carry over; ChoralRoot’s own options start at defaults and LOWCUT/BASS+ becomes Off",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "converted: After ChoralRoot saves its newer settings format, returning to GHOULBOX starts preferences and panel calibration from defaults; it cannot read the newer record and does not retry the older copy merely because the format changed; on entering ChoralRoot, panel calibration and HOLD can carry over; ChoralRoot’s own options start at defaults and LOWCUT/BASS+ becomes Off"
       },
       {
        "way": "by itself, only if core failure barred Dual Core while the stored setting was On",
        "effect": "converted: After ChoralRoot saves its newer settings format, returning to GHOULBOX starts preferences and panel calibration from defaults; it cannot read the newer record and does not retry the older copy merely because the format changed; on entering ChoralRoot, panel calibration and HOLD can carry over; ChoralRoot’s own options start at defaults and LOWCUT/BASS+ becomes Off"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "converted: After ChoralRoot saves its newer settings format, returning to GHOULBOX starts preferences and panel calibration from defaults; it cannot read the newer record and does not retry the older copy merely because the format changed; on entering ChoralRoot, panel calibration and HOLD can carry over; ChoralRoot’s own options start at defaults and LOWCUT/BASS+ becomes Off"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (it asks or arms a second turn first)",
        "effect": "converted: After ChoralRoot saves its newer settings format, returning to GHOULBOX starts preferences and panel calibration from defaults; it cannot read the newer record and does not retry the older copy merely because the format changed; on entering ChoralRoot, panel calibration and HOLD can carry over; ChoralRoot’s own options start at defaults and LOWCUT/BASS+ becomes Off"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (no question)",
        "effect": "converted: After ChoralRoot saves its newer settings format, returning to GHOULBOX starts preferences and panel calibration from defaults; it cannot read the newer record and does not retry the older copy merely because the format changed; on entering ChoralRoot, panel calibration and HOLD can carry over; ChoralRoot’s own options start at defaults and LOWCUT/BASS+ becomes Off"
       },
       {
        "way": "when you hold SAVE for a global save (no question)",
        "effect": "converted: After ChoralRoot saves its newer settings format, returning to GHOULBOX starts preferences and panel calibration from defaults; it cannot read the newer record and does not retry the older copy merely because the format changed; on entering ChoralRoot, panel calibration and HOLD can carry over; ChoralRoot’s own options start at defaults and LOWCUT/BASS+ becomes Off"
       },
       {
        "way": "when you keep calibration or enter update with OCT- + OCT+ + HOME held for 5 s (no question)",
        "effect": "converted: After ChoralRoot saves its newer settings format, returning to GHOULBOX starts preferences and panel calibration from defaults; it cannot read the newer record and does not retry the older copy merely because the format changed; on entering ChoralRoot, panel calibration and HOLD can carry over; ChoralRoot’s own options start at defaults and LOWCUT/BASS+ becomes Off"
       },
       {
        "way": "when you restore settings from backup software (no question)",
        "effect": "converted: After ChoralRoot saves its newer settings format, returning to GHOULBOX starts preferences and panel calibration from defaults; it cannot read the newer record and does not retry the older copy merely because the format changed; on entering ChoralRoot, panel calibration and HOLD can carry over; ChoralRoot’s own options start at defaults and LOWCUT/BASS+ becomes Off"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patches for user sounds",
      "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": "user sample slot USR1",
      "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": "damaged (part of it written over)"
       },
       {
        "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)"
       },
       {
        "way": "when you restore CZ bank E (id 18) from backup software (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "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": "damaged (part of it written over)"
       },
       {
        "way": "when you restore CZ bank H (id 21) from backup software (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 17–32",
      "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: user sample slot USR2; user sample slot USR3; settings and panel calibration (converted: After ChoralRoot saves its newer settings format, returning to GHOULBOX starts preferences and panel calibration from defaults; it cannot read the newer record and does not retry the older copy merely because the format changed; on entering ChoralRoot, panel calibration and HOLD can carry over; ChoralRoot’s own options start at defaults and LOWCUT/BASS+ becomes Off). At risk when you act: project A; project B; project C; project D; FM6 patches for user sounds; user sample slot USR1; user sounds 1–16; user sounds 17–32.",
    "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": "project A",
      "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 B",
      "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 C",
      "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 D",
      "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": "FM6 patches for user sounds",
      "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": "user sample slot USR1",
      "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": "user sample slot USR2",
      "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": "user sample slot USR3",
      "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": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 17–32",
      "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": "music in progress (RESTORE LAST)",
      "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": "FM6 voice bank B1–B32",
      "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 and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "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: project A; project B; project C; project D; FM6 patches for user sounds. At risk when you act: user sample slot USR1; user sample slot USR2; user sample slot USR3; user sounds 1–16; user sounds 17–32; music in progress (RESTORE LAST); FM6 voice bank B1–B32; settings and panel calibration. 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 and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm deletion of the active user slot (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE in the save screen (no question)",
        "effect": "lost"
       },
       {
        "way": "when you release a short SAVE (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings and panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "hortator",
    "name": "Hortator",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (no question)",
        "effect": "lost"
       },
       {
        "way": "when you remember or forget a Bluetooth device (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "user sample slot USR1 (Sample bytes remain on the unit; playback follows Hortator’s one-shot engines, so loop and slice behaviour can differ. Valid header and zone bounds are required; no unit switch was tested)",
     "user sample slot USR2 (Sample bytes remain on the unit; playback follows Hortator’s one-shot engines, so loop and slice behaviour can differ. Valid header and zone bounds are required; no unit switch was tested)",
     "user sample slot USR3 (Sample bytes remain on the unit; playback follows Hortator’s one-shot engines, so loop and slice behaviour can differ. Valid header and zone bounds are required; no unit switch was tested)"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings and panel calibration. At risk when you act: project A; project B; project C; project D. Carried over: user sample slot USR1 (Sample bytes remain on the unit; playback follows Hortator’s one-shot engines, so loop and slice behaviour can differ. Valid header and zone bounds are required; no unit switch was tested); user sample slot USR2 (Sample bytes remain on the unit; playback follows Hortator’s one-shot engines, so loop and slice behaviour can differ. Valid header and zone bounds are required; no unit switch was tested); user sample slot USR3 (Sample bytes remain on the unit; playback follows Hortator’s one-shot engines, so loop and slice behaviour can differ. Valid header and zone bounds are required; no unit switch was tested).",
    "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": "settings and panel calibration",
      "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: settings and panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "polly",
    "name": "Polly",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patches for user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you complete power-on hardware calibration (no question) [through its preset bank]",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question) [through its preset bank]",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG and confirm if it asks (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (no question)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete power-on hardware calibration (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "music in progress (RESTORE LAST)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 voice bank B1–B32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: project A; project B; project C; project D; FM6 patches for user sounds; user sample slot USR1; user sample slot USR2; settings and panel calibration. At risk when you act: user sample slot USR3; user sounds 1–16; user sounds 17–32; music in progress (RESTORE LAST); FM6 voice bank B1–B32.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "skiff",
    "name": "Skiff",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "music in progress (RESTORE LAST)",
      "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": "FM6 voice bank B1–B32",
      "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 and panel calibration",
      "effect": "changed by itself: On a clean start without its scene-freed marker, Skiff clears GURDY stars, click preferences, the preset category and part of the FX key map, changes secondary MENU choices, then saves without asking. A prior Skiff marker and revision can survive a GHOULBOX round trip, so this write remains conditional. One newest modified copy is enough to change settings on return; revision writes can replace both copies. BLANK becomes DUNGEON on return after Skiff next saves settings. Out-of-range clock, MIDI-input or tuning bytes can also be adjusted and saved after one second, once stopped, changing more FX assignments even when revision migration is skipped; also, Skiff retains calibration but can replace preferences without a save command or question; a partial import does not preserve the whole settings record",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "changed by itself: On a clean start without its scene-freed marker, Skiff clears GURDY stars, click preferences, the preset category and part of the FX key map, changes secondary MENU choices, then saves without asking. A prior Skiff marker and revision can survive a GHOULBOX round trip, so this write remains conditional. One newest modified copy is enough to change settings on return; revision writes can replace both copies. BLANK becomes DUNGEON on return after Skiff next saves settings. Out-of-range clock, MIDI-input or tuning bytes can also be adjusted and saved after one second, once stopped, changing more FX assignments even when revision migration is skipped; also, Skiff retains calibration but can replace preferences without a save command or question; a partial import does not preserve the whole settings record"
       },
       {
        "way": "by itself, only if Skiff has not yet made its one-time settings changes",
        "effect": "changed by itself: On a clean start without its scene-freed marker, Skiff clears GURDY stars, click preferences, the preset category and part of the FX key map, changes secondary MENU choices, then saves without asking. A prior Skiff marker and revision can survive a GHOULBOX round trip, so this write remains conditional. One newest modified copy is enough to change settings on return; revision writes can replace both copies. BLANK becomes DUNGEON on return after Skiff next saves settings. Out-of-range clock, MIDI-input or tuning bytes can also be adjusted and saved after one second, once stopped, changing more FX assignments even when revision migration is skipped; also, Skiff retains calibration but can replace preferences without a save command or question; a partial import does not preserve the whole settings record"
       },
       {
        "way": "by itself, only if the old scene-byte area has not been freed yet",
        "effect": "changed by itself: On a clean start without its scene-freed marker, Skiff clears GURDY stars, click preferences, the preset category and part of the FX key map, changes secondary MENU choices, then saves without asking. A prior Skiff marker and revision can survive a GHOULBOX round trip, so this write remains conditional. One newest modified copy is enough to change settings on return; revision writes can replace both copies. BLANK becomes DUNGEON on return after Skiff next saves settings. Out-of-range clock, MIDI-input or tuning bytes can also be adjusted and saved after one second, once stopped, changing more FX assignments even when revision migration is skipped; also, Skiff retains calibration but can replace preferences without a save command or question; a partial import does not preserve the whole settings record"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (no question)",
        "effect": "changed by itself: On a clean start without its scene-freed marker, Skiff clears GURDY stars, click preferences, the preset category and part of the FX key map, changes secondary MENU choices, then saves without asking. A prior Skiff marker and revision can survive a GHOULBOX round trip, so this write remains conditional. One newest modified copy is enough to change settings on return; revision writes can replace both copies. BLANK becomes DUNGEON on return after Skiff next saves settings. Out-of-range clock, MIDI-input or tuning bytes can also be adjusted and saved after one second, once stopped, changing more FX assignments even when revision migration is skipped; also, Skiff retains calibration but can replace preferences without a save command or question; a partial import does not preserve the whole settings record"
       },
       {
        "way": "when you confirm RESET SETTINGS (it asks or arms a second turn first)",
        "effect": "changed by itself: On a clean start without its scene-freed marker, Skiff clears GURDY stars, click preferences, the preset category and part of the FX key map, changes secondary MENU choices, then saves without asking. A prior Skiff marker and revision can survive a GHOULBOX round trip, so this write remains conditional. One newest modified copy is enough to change settings on return; revision writes can replace both copies. BLANK becomes DUNGEON on return after Skiff next saves settings. Out-of-range clock, MIDI-input or tuning bytes can also be adjusted and saved after one second, once stopped, changing more FX assignments even when revision migration is skipped; also, Skiff retains calibration but can replace preferences without a save command or question; a partial import does not preserve the whole settings record"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "changed by itself: On a clean start without its scene-freed marker, Skiff clears GURDY stars, click preferences, the preset category and part of the FX key map, changes secondary MENU choices, then saves without asking. A prior Skiff marker and revision can survive a GHOULBOX round trip, so this write remains conditional. One newest modified copy is enough to change settings on return; revision writes can replace both copies. BLANK becomes DUNGEON on return after Skiff next saves settings. Out-of-range clock, MIDI-input or tuning bytes can also be adjusted and saved after one second, once stopped, changing more FX assignments even when revision migration is skipped; also, Skiff retains calibration but can replace preferences without a save command or question; a partial import does not preserve the whole settings record"
       }
      ]
     },
     {
      "object": "project A",
      "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": "project B",
      "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": "project C",
      "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": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself, only if a readable old Felucca/Skiff project needs migration, with room for its patterns",
        "effect": "lost"
       },
       {
        "way": "when you SAVE AS from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project through the browser’s legacy command (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "FM6 patches for user sounds (an FM6 patch must still match its user record)",
     "user sample slot USR1 (sample playback and loop behaviour follow the reader’s engines)",
     "user sample slot USR2 (sample playback and loop behaviour follow the reader’s engines)",
     "user sample slot USR3 (sample playback and loop behaviour follow the reader’s engines)",
     "user sounds 1–16 (GURDY records become DRUM-X; a matching name does not prove the same sound)",
     "user sounds 17–32 (GURDY records become DRUM-X; a matching name does not prove the same sound)"
    ],
    "kept_unseen": [],
    "notes": [
     "Imports GHOULBOX’s saved RESTORE LAST state (ON by default)."
    ],
    "owner_text": "At risk by itself: music in progress (RESTORE LAST); FM6 voice bank B1–B32; settings and panel calibration (changed by itself: On a clean start without its scene-freed marker, Skiff clears GURDY stars, click preferences, the preset category and part of the FX key map, changes secondary MENU choices, then saves without asking. A prior Skiff marker and revision can survive a GHOULBOX round trip, so this write remains conditional. One newest modified copy is enough to change settings on return; revision writes can replace both copies. BLANK becomes DUNGEON on return after Skiff next saves settings. Out-of-range clock, MIDI-input or tuning bytes can also be adjusted and saved after one second, once stopped, changing more FX assignments even when revision migration is skipped; also, Skiff retains calibration but can replace preferences without a save command or question; a partial import does not preserve the whole settings record). At risk by itself, under a condition: project A; project B; project C; project D. Carried over: FM6 patches for user sounds (an FM6 patch must still match its user record); user sample slot USR1 (sample playback and loop behaviour follow the reader’s engines); user sample slot USR2 (sample playback and loop behaviour follow the reader’s engines); user sample slot USR3 (sample playback and loop behaviour follow the reader’s engines); user sounds 1–16 (GURDY records become DRUM-X; a matching name does not prove the same sound); user sounds 17–32 (GURDY records become DRUM-X; a matching name does not prove the same sound). Imports GHOULBOX’s saved RESTORE LAST state (ON by default).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ]
 },
 "disagreements": [
  {
   "topic": "STEP requires REC",
   "docs_say": "The guide’s step-entry instructions go straight from opening STEP to pressing note keys.",
   "source_says": "Melodic STEP writes only with the selected track armed and transport stopped; otherwise keys play without editing the cursor step.",
   "docs_ref": {
    "kind": "doc",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "docs/guide/guide.html",
    "lines": "643-649",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/docs/guide/guide.html#L643-L649"
   },
   "source_ref": {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_input.c",
    "lines": "1658-1671",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1658-L1671"
   },
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "1658-1671",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1658-L1671"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "541-569",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L541-L569"
    }
   ]
  },
  {
   "topic": "REC starts live playback",
   "docs_say": "The live-recording instructions say to arm REC and then press PLAY.",
   "source_says": "Arming REC while stopped starts transport immediately outside melodic STEP; a subsequent PLAY press can stop it.",
   "docs_ref": {
    "kind": "doc",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "docs/guide/guide.html",
    "lines": "651-652",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/docs/guide/guide.html#L651-L652"
   },
   "source_ref": {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_input.c",
    "lines": "541-569",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L541-L569"
   },
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "541-569",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L541-L569"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "1604-1612",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1604-L1612"
    }
   ]
  },
  {
   "topic": "ALGORITHM and PRESETS have exceptions",
   "docs_say": "The quick-start list describes ALGORITHM as track selection and PRESETS as sound selection without page qualifications.",
   "source_says": "MENU uses them for tabs and rows; PRESETS moves cursors on STEP, AUTOMATION, USER, PHRASES, PROJECT and SONG and does nothing on TOOLS or SLICES.",
   "docs_ref": {
    "kind": "doc",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "docs/guide/guide.html",
    "lines": "197-201",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/docs/guide/guide.html#L197-L201"
   },
   "source_ref": {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_input.c",
    "lines": "1106-1131",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1106-L1131"
   },
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "1106-1131",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1106-L1131"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_menu.c",
     "lines": "490-524",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_menu.c#L490-L524"
    }
   ]
  },
  {
   "topic": "ANIM also changes HOME",
   "docs_say": "The guide presents ANIM and HOME as separate display settings.",
   "source_says": "Changing ANIM to OFF or IDLE also selects HOME TRACKS, while ANIM ON selects HOME SCOPE, through a switch fallthrough.",
   "docs_ref": {
    "kind": "doc",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "docs/guide/guide.html",
    "lines": "699",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/docs/guide/guide.html#L699"
   },
   "source_ref": {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/menu_items.c",
    "lines": "233-239",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/menu_items.c#L233-L239"
   },
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/menu_items.c",
     "lines": "233-239",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/menu_items.c#L233-L239"
    }
   ]
  },
  {
   "topic": "Backup coverage",
   "docs_say": "The guide calls the editor’s archive a full backup.",
   "source_says": "The archive omits the independent FM6 voice bank, the standalone autosave record and manual-slice tail records beyond exported sample audio.",
   "docs_ref": {
    "kind": "doc",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "docs/guide/guide.html",
    "lines": "689-691",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/docs/guide/guide.html#L689-L691"
   },
   "source_ref": {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/editor_backup.c",
    "lines": "11-59",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/editor_backup.c#L11-L59"
   },
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/editor_backup.c",
     "lines": "11-59",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/editor_backup.c#L11-L59"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/slice_store.c",
     "lines": "21-36",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/slice_store.c#L21-L36"
    }
   ]
  },
  {
   "topic": "Autosave wait",
   "docs_say": "The guide advises stopping for a few seconds before switching off.",
   "source_says": "A changed session must stay quiet for ten seconds and writes are at least sixty seconds apart, so a short pause may not save the latest edit; the guide’s later saving section specifies ten seconds but omits the write interval.",
   "docs_ref": {
    "kind": "doc",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "docs/guide/guide.html",
    "lines": "203",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/docs/guide/guide.html#L203"
   },
   "source_ref": {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/project.c",
    "lines": "1239-1257",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/project.c#L1239-L1257"
   },
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/project.c",
     "lines": "1239-1257",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/project.c#L1239-L1257"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/project.c",
     "lines": "1299-1338",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/project.c#L1299-L1338"
    },
    {
     "kind": "doc",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "docs/guide/guide.html",
     "lines": "691",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/docs/guide/guide.html#L691"
    }
   ]
  }
 ],
 "not_mapped": [
  "No hardware was exercised; encoder response, physical button calibration and audio behavior are established only by source reading.",
  "An exact downgrade to each older GHOULBOX release is not established from the 2.1 tree; the np=112 loader compatibility condition is recorded instead.",
  "The hosted editor and installer are outside this source snapshot; browser confirmation wording and actual hosted behavior are not verified.",
  "Factory diagnostics and developer console commands are outside the owner control map; calibration, rescue and update entry are mapped."
 ],
 "undocumented": [
  {
   "topic": "Additional sound pages",
   "note": "VOICE 3, DRUM LANES and LANES 2, and FM6 OPERATOR, OP ENV and OPERATOR 2 are reachable but absent from the guide’s page table.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/params.c",
     "lines": "436-449",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L436-L449"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "379-393",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L379-L393"
    }
   ]
  },
  {
   "topic": "Loaded SLICE sounds",
   "note": "SLICE stays compiled for stored projects and user sounds, including SLICES editing, although it is removed from engine selection and the guide reference.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/core.h",
     "lines": "16-33",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/core.h#L16-L33"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/engines.c",
     "lines": "118-129",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/engines.c#L118-L129"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "385-390",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L385-L390"
    }
   ]
  },
  {
   "topic": "PHRASES LOAD card",
   "note": "The LOAD card is drawn but turning KNOB 2 does nothing; OCT+ always acts on the selected phrase.",
   "source": [
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui_input.c",
     "lines": "881-894",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L881-L894"
    },
    {
     "kind": "source",
     "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
     "ref": "ghoulbox-v2.1",
     "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
     "path": "firmware/src/ui.c",
     "lines": "1572-1577",
     "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L1572-L1577"
    }
   ]
  }
 ],
 "saving_note": {
  "power_off": "Switching off does not perform a save; RESTORE LAST must be on, the changed session must be stopped and quiet for ten seconds, and a previous write must be at least sixty seconds old. Explicitly save a project when unsure.",
  "evidence": "read-in-source",
  "source": [
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/project.c",
    "lines": "1239-1257",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/project.c#L1239-L1257"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/project.c",
    "lines": "1299-1366",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/project.c#L1299-L1366"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_input.c",
    "lines": "975-981",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L975-L981"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_name.c",
    "lines": "91-100",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L91-L100"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_name.c",
    "lines": "221-241",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L221-L241"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_name.c",
    "lines": "244-265",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_name.c#L244-L265"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/upreset.c",
    "lines": "102-105",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L102-L105"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/upreset.c",
    "lines": "307-343",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L307-L343"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/upreset.c",
    "lines": "438-448",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L438-L448"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/upreset.c",
    "lines": "570-590",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L570-L590"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/up_fm6.c",
    "lines": "76-83",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/up_fm6.c#L76-L83"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/up_fm6.c",
    "lines": "117-124",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/up_fm6.c#L117-L124"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/up_fm6.c",
    "lines": "201-213",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/up_fm6.c#L201-L213"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/upreset.c",
    "lines": "72-105",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L72-L105"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/upreset.c",
    "lines": "394",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L394"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/upreset.c",
    "lines": "590",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/upreset.c#L590"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/category.c",
    "lines": "7-14",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/category.c#L7-L14"
   }
  ],
  "fm6_category_warning": "An FM6 rename or category change can detach its saved patch, even with OTHER left unchanged; a later load may use a factory or initial voice."
 },
 "licence_source": [
  {
   "kind": "doc",
   "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
   "ref": "ghoulbox-v2.1",
   "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
   "path": "README.md",
   "lines": "198-205",
   "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/README.md#L198-L205"
  },
  {
   "kind": "doc",
   "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
   "ref": "ghoulbox-v2.1",
   "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
   "path": "LICENSE",
   "lines": "1-4",
   "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/LICENSE#L1-L4"
  }
 ],
 "mode_rules": {
  "priority": "Rescue/calibration and sleeping input take priority; normal UI then handles update overlay, menu, confirmation, NAME, quick layers and the underlying page. More specific key-playing modes override generic any key entries.",
  "conditional_pages": "A mode with inherits changes only the named parameter; other parts keep the base page jobs. Simultaneous conditional descriptors combine. HOME engine variants refine HOME.",
  "held_steps": "Held-step entries name eligible keys; several grid steps can receive locks or nudges together, but locking needs an assigned automatable parameter and an unavailable lock card can leave an existing hit pending removal on release. FX reset targets the most recently pressed white key still held.",
  "layers": "Layer-mode press_while_holding entries also apply when that layer is double-tap locked; ordinary key playing is blocked there.",
  "source": [
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_input.c",
    "lines": "1404-1534",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1404-L1534"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_input.c",
    "lines": "1542-1592",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1542-L1592"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_input.c",
    "lines": "1693-1726",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L1693-L1726"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_layer.c",
    "lines": "177-221",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_layer.c#L177-L221"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_draw.c",
    "lines": "1390-1435",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_draw.c#L1390-L1435"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/params.c",
    "lines": "448-449",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/params.c#L448-L449"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/motion.c",
    "lines": "34-42",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/motion.c#L34-L42"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui.c",
    "lines": "449-465",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui.c#L449-L465"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_input.c",
    "lines": "637-645",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L637-L645"
   },
   {
    "kind": "source",
    "repo": "jasonpersinger/ghoulbox-fm1-dungeon-synth",
    "ref": "ghoulbox-v2.1",
    "commit": "eaf04bdc67baed36113cd1e71636e7e059299086",
    "path": "firmware/src/ui_input.c",
    "lines": "685-724",
    "url": "https://github.com/jasonpersinger/ghoulbox-fm1-dungeon-synth/blob/eaf04bdc67baed36113cd1e71636e7e059299086/firmware/src/ui_input.c#L685-L724"
   }
  ]
 },
 "refresh_check_fixes": [
  {
   "round": 1,
   "error": "1 CLEAR LOCKS needs an open recording step",
   "fixed": "Restricted melodic lock clearing to armed, stopped entry and added the unarmed whole-step deletion warning.",
   "at": "controls.button_edit[8], controls.button_edit[32], controls.button_edit[33], controls.button_edit[34], controls.button_edit[35], controls.button_edit[36], controls.button_edit[37], controls.button_edit[38], controls.button_edit[39], controls.button_edit[40], controls.button_edit[41], controls.button_edit[42], controls.button_edit[43], controls.button_edit[44], controls.button_edit[45], controls.button_edit[46], controls.button_edit[47], controls.button_edit[48], controls.button_edit[49], controls.button_edit[50], controls.button_edit[51], controls.button_edit[52], controls.button_edit[53], controls.button_edit[54], controls.button_edit[55], controls.button_edit[56], controls.button_edit[57], control-maps/ghoulbox.md: Record and edit a pattern"
  },
  {
   "round": 1,
   "error": "2 Lock availability and drum-hit removal",
   "fixed": "Added the assigned/automatable-parameter condition and the failed-target drum-hit deletion consequence.",
   "at": "controls.encoder_knob1[1], controls.encoder_knob1[2], controls.encoder_knob1[98], controls.encoder_knob1[99], controls.encoder_knob1[100], controls.encoder_knob1[101], controls.encoder_knob1[102], controls.encoder_knob1[103], controls.encoder_knob1[104], controls.encoder_knob1[105], controls.encoder_knob1[106], controls.encoder_knob1[107], controls.encoder_knob1[108], controls.encoder_knob1[109], controls.encoder_knob1[110], controls.encoder_knob1[111], controls.encoder_knob1[112], controls.encoder_knob1[113], controls.encoder_knob1[114], controls.encoder_knob1[115], controls.encoder_knob1[116], controls.encoder_knob1[117], controls.encoder_knob1[118], controls.encoder_knob1[119], controls.encoder_knob1[120], controls.encoder_knob1[121], controls.encoder_knob1[122], controls.encoder_knob1[123], controls.encoder_knob1[124], controls.encoder_knob1[125], controls.encoder_knob1[126], controls.encoder_knob1[127], controls.encoder_knob1[128], controls.encoder_knob1[129], controls.encoder_knob1[130], controls.encoder_knob1[131], controls.encoder_knob1[132], controls.encoder_knob1[133], controls.encoder_knob1[134], controls.encoder_knob1[135], controls.encoder_knob1[136], controls.encoder_knob1[137], controls.encoder_knob1[138]"
  },
  {
   "round": 1,
   "error": "2 Lock availability and drum-hit removal",
   "fixed": "Added the assigned/automatable-parameter condition and the failed-target drum-hit deletion consequence.",
   "at": "controls.encoder_knob2[1], controls.encoder_knob2[2], controls.encoder_knob2[102], controls.encoder_knob2[103], controls.encoder_knob2[104], controls.encoder_knob2[105], controls.encoder_knob2[106], controls.encoder_knob2[107], controls.encoder_knob2[108], controls.encoder_knob2[109], controls.encoder_knob2[110], controls.encoder_knob2[111], controls.encoder_knob2[112], controls.encoder_knob2[113], controls.encoder_knob2[114], controls.encoder_knob2[115], controls.encoder_knob2[116], controls.encoder_knob2[117], controls.encoder_knob2[118], controls.encoder_knob2[119], controls.encoder_knob2[120], controls.encoder_knob2[121], controls.encoder_knob2[122], controls.encoder_knob2[123], controls.encoder_knob2[124], controls.encoder_knob2[125], controls.encoder_knob2[126], controls.encoder_knob2[127], controls.encoder_knob2[128], controls.encoder_knob2[129], controls.encoder_knob2[130], controls.encoder_knob2[131], controls.encoder_knob2[132], controls.encoder_knob2[133], controls.encoder_knob2[134], controls.encoder_knob2[135], controls.encoder_knob2[136], controls.encoder_knob2[137], controls.encoder_knob2[138], controls.encoder_knob2[139], controls.encoder_knob2[140], controls.encoder_knob2[141], controls.encoder_knob2[142]"
  },
  {
   "round": 1,
   "error": "2 Lock availability and drum-hit removal",
   "fixed": "Added the assigned/automatable-parameter condition and the failed-target drum-hit deletion consequence.",
   "at": "controls.encoder_knob3[1], controls.encoder_knob3[2], controls.encoder_knob3[100], controls.encoder_knob3[101], controls.encoder_knob3[102], controls.encoder_knob3[103], controls.encoder_knob3[104], controls.encoder_knob3[105], controls.encoder_knob3[106], controls.encoder_knob3[107], controls.encoder_knob3[108], controls.encoder_knob3[109], controls.encoder_knob3[110], controls.encoder_knob3[111], controls.encoder_knob3[112], controls.encoder_knob3[113], controls.encoder_knob3[114], controls.encoder_knob3[115], controls.encoder_knob3[116], controls.encoder_knob3[117], controls.encoder_knob3[118], controls.encoder_knob3[119], controls.encoder_knob3[120], controls.encoder_knob3[121], controls.encoder_knob3[122], controls.encoder_knob3[123], controls.encoder_knob3[124], controls.encoder_knob3[125], controls.encoder_knob3[126], controls.encoder_knob3[127], controls.encoder_knob3[128], controls.encoder_knob3[129], controls.encoder_knob3[130], controls.encoder_knob3[131], controls.encoder_knob3[132], controls.encoder_knob3[133], controls.encoder_knob3[134], controls.encoder_knob3[135], controls.encoder_knob3[136], controls.encoder_knob3[137], controls.encoder_knob3[138], controls.encoder_knob3[139], controls.encoder_knob3[140]"
  },
  {
   "round": 1,
   "error": "2 Lock availability and drum-hit removal",
   "fixed": "Added the assigned/automatable-parameter condition and the failed-target drum-hit deletion consequence.",
   "at": "controls.encoder_knob4[1], controls.encoder_knob4[2], controls.encoder_knob4[99], controls.encoder_knob4[100], controls.encoder_knob4[101], controls.encoder_knob4[102], controls.encoder_knob4[103], controls.encoder_knob4[104], controls.encoder_knob4[105], controls.encoder_knob4[106], controls.encoder_knob4[107], controls.encoder_knob4[108], controls.encoder_knob4[109], controls.encoder_knob4[110], controls.encoder_knob4[111], controls.encoder_knob4[112], controls.encoder_knob4[113], controls.encoder_knob4[114], controls.encoder_knob4[115], controls.encoder_knob4[116], controls.encoder_knob4[117], controls.encoder_knob4[118], controls.encoder_knob4[119], controls.encoder_knob4[120], controls.encoder_knob4[121], controls.encoder_knob4[122], controls.encoder_knob4[123], controls.encoder_knob4[124], controls.encoder_knob4[125], controls.encoder_knob4[126], controls.encoder_knob4[127], controls.encoder_knob4[128], controls.encoder_knob4[129], controls.encoder_knob4[130], controls.encoder_knob4[131], controls.encoder_knob4[132], controls.encoder_knob4[133], controls.encoder_knob4[134], controls.encoder_knob4[135], controls.encoder_knob4[136], controls.encoder_knob4[137], controls.encoder_knob4[138], controls.encoder_knob4[139]"
  },
  {
   "round": 1,
   "error": "2 Held-step advice",
   "fixed": "Qualified the key-target hints, shared held-step rule and guide instructions instead of promising every knob turn will preserve a hit.",
   "at": "controls.key_f3[5], controls.key_g3[5], controls.key_a3[5], controls.key_b3[5], controls.key_c4[5], controls.key_d4[5], controls.key_e4[5], controls.key_f4[5], controls.key_g4[5], controls.key_a4[5], controls.key_b4[5], controls.key_c5[5], controls.key_d5[5], controls.key_e5[5], controls.key_f5[5], controls.key_g5[5], mode_rules.held_steps, control-maps/ghoulbox.md: Record and edit a pattern"
  },
  {
   "round": 1,
   "error": "3 FM6 category change detaches the patch",
   "fixed": "Disclosed the tag mismatch and factory/init fallback in NAME actions, saving/switching advice and both preset-bank and FM6-patch storage records.",
   "at": "controls.encoder_knob3[13], controls.button_oct_up[14], saving_note.fm6_category_warning, switching_note.fm6_category_warning, control-maps/ghoulbox.md: Save, load and name work, refresh/work/ghoulbox.storage.json: objects ghoulbox.user_presets_1, ghoulbox.user_presets_2, ghoulbox.fm6_user_patches; firmware_notes.ghoulbox"
  },
  {
   "round": 1,
   "error": "4 Current Melodee layout and first-write risk",
   "fixed": "Replaced the nonexistent project-overlap target in place, filled its actual U379–U384 overlap, corrected both bank layouts, and removed the unsupported first-write copy-preservation promise.",
   "at": "refresh/work/ghoulbox.storage.json: reads_foreign[40], refresh/work/ghoulbox.storage.json: reads_foreign[48], refresh/work/ghoulbox.storage.json: reads_foreign[57], refresh/work/ghoulbox.storage.json: reads_foreign[65], switching_note.melodee_storage_warning, refresh/work/ghoulbox.storage.json: firmware_notes.ghoulbox"
  },
  {
   "round": 1,
   "error": "5 REC double-tap needs a successful first tap",
   "fixed": "Added the arming prerequisite and song-state exceptions.",
   "at": "controls.button_rec[4], control-maps/ghoulbox.md: The modes"
  },
  {
   "round": 1,
   "error": "6 Drone replacement checks only the first arriving note",
   "fixed": "Corrected every drone press action and the guide; a later shared chord tone does not stop the new drone.",
   "at": "controls.key_f3[20], controls.key_fs3[18], controls.key_g3[20], controls.key_gs3[18], controls.key_a3[21], controls.key_as3[18], controls.key_b3[21], controls.key_c4[21], controls.key_cs4[18], controls.key_d4[21], controls.key_ds4[18], controls.key_e4[20], controls.key_f4[20], controls.key_fs4[18], controls.key_g4[20], controls.key_gs4[18], controls.key_a4[20], controls.key_as4[18], controls.key_b4[20], controls.key_c5[20], controls.key_cs5[18], controls.key_d5[20], controls.key_ds5[18], controls.key_e5[20], controls.key_f5[20], controls.key_fs5[18], controls.key_g5[20], control-maps/ghoulbox.md: Play, change tracks and hold a drone"
  },
  {
   "round": 1,
   "error": "7 Drone-release sustain evidence",
   "fixed": "Replaced the short release citation with the complete note-off path and latched-note guard.",
   "at": "controls.key_f3[21].source, controls.key_fs3[19].source, controls.key_g3[21].source, controls.key_gs3[19].source, controls.key_a3[22].source, controls.key_as3[19].source, controls.key_b3[22].source, controls.key_c4[22].source, controls.key_cs4[19].source, controls.key_d4[22].source, controls.key_ds4[19].source, controls.key_e4[21].source, controls.key_f4[21].source, controls.key_fs4[19].source, controls.key_g4[21].source, controls.key_gs4[19].source, controls.key_a4[21].source, controls.key_as4[19].source, controls.key_b4[21].source, controls.key_c5[21].source, controls.key_cs5[19].source, controls.key_d5[21].source, controls.key_ds5[19].source, controls.key_e5[21].source, controls.key_f5[21].source, controls.key_fs5[19].source, controls.key_g5[21].source"
  },
  {
   "round": 1,
   "error": "8 Distinct F3 clear labels",
   "fixed": "Named SEQ’s step-only clear CLEAR STEPS and REC’s sequence-plus-motion clear CLEAR TRACK.",
   "at": "controls.key_f3[10].short_label, controls.key_f3[11].short_label"
  },
  {
   "round": 1,
   "error": "requested Switching-table notice and generated markers",
   "fixed": "Added an empty generated switching block and made the pending GHOULBOX switching-table integration explicit alongside every owner-facing atlas pointer.",
   "at": "control-maps/ghoulbox.md: Before you switch firmware, switching_note.kept_on_unit, switching_note.lost, switching_note.writes_when, switching_note.table_status, refresh/work/ghoulbox.storage.json: switching_table_status, firmware_notes.ghoulbox"
  },
  {
   "round": 1,
   "error": "5 REC layer navigation prerequisite",
   "fixed": "Applied the first-tap arming condition to the REC mode navigation text too.",
   "at": "modes[19].how_to_get_there"
  },
  {
   "round": 1,
   "error": "1 Open-step condition also governs melodic nudge",
   "fixed": "Restricted the related melodic held-key nudge actions to the same open, armed recording-step target; ordinary unarmed STEP retains cursor movement.",
   "at": "controls.encoder_presets[7], controls.encoder_presets[25], controls.encoder_presets[26], controls.encoder_presets[27], controls.encoder_presets[28], controls.encoder_presets[29], controls.encoder_presets[30], controls.encoder_presets[31], controls.encoder_presets[32], controls.encoder_presets[33], controls.encoder_presets[34], controls.encoder_presets[35], controls.encoder_presets[36], controls.encoder_presets[37], controls.encoder_presets[38], controls.encoder_presets[39], controls.encoder_presets[40], controls.encoder_presets[41], controls.encoder_presets[42], controls.encoder_presets[43], controls.encoder_presets[44], controls.encoder_presets[45], controls.encoder_presets[46], controls.encoder_presets[47], controls.encoder_presets[48], controls.encoder_presets[49], controls.encoder_presets[50], control-maps/ghoulbox.md: Record and edit a pattern"
  },
  {
   "round": 2,
   "error": "3 FM6 name-only rename also detaches patches",
   "fixed": "Removed the unsafe keep-category-unchanged precaution everywhere; warnings now include name-only renames with OTHER displayed, and storage notes explain CAT_NONE normalization, the stale patch tag and factory/init fallback.",
   "at": "controls.encoder_knob3[13], controls.button_oct_up[14], saving_note.fm6_category_warning, switching_note.fm6_category_warning, control-maps/ghoulbox.md: both FM6 category warnings, refresh/work/ghoulbox.storage.json: objects[5] ghoulbox.user_presets_1, notes/src.category_change and written_when[2], refresh/work/ghoulbox.storage.json: objects[6] ghoulbox.user_presets_2, notes/src.category_change and written_when[2], refresh/work/ghoulbox.storage.json: objects[7] ghoulbox.fm6_user_patches, notes/src.category_change and load_rule, refresh/work/ghoulbox.storage.json: firmware_notes.ghoulbox"
  },
  {
   "round": 3,
   "error": "panel overlay: the home primaries 'OCTAVE −' / 'OCTAVE +' do not fit beside the OCT pair (build: no room)",
   "fixed": "Labels OCT - / OCT +, the house style of the stock, Baud Girl, Felucca, SLOOP, JIANT and FoMni maps; actions unchanged.",
   "at": "controls.button_oct_down[0].short_label; controls.button_oct_up[0].short_label"
  },
  {
   "round": 4,
   "error": "overlay GHOULBOX 1: missing HOME knob jobs",
   "fixed": "Appended one HOME turn entry per knob, labeled MAIN 1 through MAIN 4, with engine-dependent examples and pinned HOME mapping sources; added matching guide rows.",
   "at": "controls.encoder_knob1[139]; controls.encoder_knob2[143]; controls.encoder_knob3[141]; controls.encoder_knob4[140]; ghoulbox.md HOME and engine pages"
  }
 ],
 "checker_disputes_refresh": []
}